miopenConvolutionBwdDataAlgoGEMM Class — pytorch Architecture
Architecture documentation for the miopenConvolutionBwdDataAlgoGEMM class in Conv_miopen.cpp from the pytorch codebase.
Entity Profile
Source Code
aten/src/ATen/native/miopen/Conv_miopen.cpp lines 419–490
template<>
struct algorithm_search<miopenConvBwdDataAlgorithm_t> {
using perf_t = miopenConvAlgoPerf_t;
using algo_t = miopenConvBwdDataAlgorithm_t;
static constexpr auto DEFAULT_ALGO = miopenConvolutionBwdDataAlgoGEMM;
static BenchmarkCache<algo_t>& cache() { return bwd_data_algos; }
static BenchmarkCache<size_t>& wsscache() { return bwd_data_wssizes; }
static perf_t findAlgorithm(const ConvolutionArgs& args, bool benchmark) {
int perf_count;
perf_t perf_results;
size_t max_ws_size = getWorkspaceSize(args, DEFAULT_ALGO);
Workspace ws(max_ws_size);
MIOPEN_CHECK(miopenFindConvolutionBackwardDataAlgorithm(
args.handle,
args.odesc.desc(), args.output.const_data_ptr(),
args.wdesc.desc(), args.weight.const_data_ptr(),
args.cdesc.desc(),
args.idesc.desc(), args.input.data_ptr(),
1, // just return the fastest
&perf_count,
&perf_results,
ws.data,
ws.size,
benchmark));
return perf_results;
}
static miopenConvSolution_t getSolution(const ConvolutionArgs& args, bool force_default) {
size_t max_solution_count;
size_t solution_count;
miopenConvSolution_t solutions[AT_MIOPEN_MAX_SOLUTIONS];
MIOPEN_CHECK(miopenConvolutionBackwardDataGetSolutionCount(
args.handle,
args.odesc.desc(),
args.wdesc.desc(),
args.cdesc.desc(),
args.idesc.desc(),
&max_solution_count));
if (max_solution_count > AT_MIOPEN_MAX_SOLUTIONS) {
TORCH_CHECK(false, "miopenConvBwdDataAlgorithm_t getSolution max_solution_count > AT_MIOPEN_MAX_SOLUTIONS");
}
MIOPEN_CHECK(miopenConvolutionBackwardDataGetSolution(
args.handle,
args.odesc.desc(),
args.wdesc.desc(),
args.cdesc.desc(),
args.idesc.desc(),
max_solution_count,
&solution_count,
solutions));
if (force_default) {
// find default alg
for (size_t i=0; i<solution_count; ++i) {
if (solutions[i].algorithm == (miopenConvAlgorithm_t)DEFAULT_ALGO) {
return solutions[i];
}
}
// default algo was not found, select first algo without workspace requirement
for (size_t i=0; i<solution_count; ++i) {
if (solutions[i].workspace_size == 0) {
return solutions[i];
}
}
// now what? fall through and hope for the best
}
return solutions[0];
}
};
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free