MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / packDataHelper

Function packDataHelper

src/backend/opencl/kernel/fftconvolve.hpp:68–123  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

66
67template<typename convT, typename T>
68void packDataHelper(Param packed, Param sig, Param filter, const int rank,
69 AF_BATCH_KIND kind) {
70 constexpr bool IsTypeDouble = std::is_same<T, double>::value;
71 constexpr auto ctDType =
72 static_cast<af_dtype>(dtype_traits<convT>::af_type);
73
74 std::array<TemplateArg, 3> targs = {
75 TemplateTypename<T>(),
76 TemplateTypename<convT>(),
77 TemplateArg(IsTypeDouble),
78 };
79 std::vector<std::string> options = {
80 DefineKeyValue(T, dtype_traits<T>::getName()),
81 getTypeBuildDefinition<T, convT>()};
82 if (ctDType == c32) {
83 options.emplace_back(DefineKeyValue(CONVT, "float"));
84 } else if (ctDType == c64 && IsTypeDouble) {
85 options.emplace_back(DefineKeyValue(CONVT, "double"));
86 }
87
88 auto packData = common::getKernel("pack_data", {{fftconvolve_pack_cl_src}},
89 targs, options);
90 auto padArray = common::getKernel("pad_array", {{fftconvolve_pack_cl_src}},
91 targs, options);
92
93 Param sig_tmp, filter_tmp;
94 calcParamSizes(sig_tmp, filter_tmp, packed, sig, filter, rank, kind);
95
96 int sig_packed_elem = sig_tmp.info.strides[3] * sig_tmp.info.dims[3];
97 int filter_packed_elem =
98 filter_tmp.info.strides[3] * filter_tmp.info.dims[3];
99
100 // Number of packed complex elements in dimension 0
101 int sig_half_d0 = divup(sig.info.dims[0], 2);
102 int sig_half_d0_odd = sig.info.dims[0] % 2;
103
104 int blocks = divup(sig_packed_elem, THREADS);
105
106 // Locate features kernel sizes
107 cl::NDRange local(THREADS);
108 cl::NDRange global(blocks * THREADS);
109
110 // Pack signal in a complex matrix where first dimension is half the input
111 // (allows faster FFT computation) and pad array to a power of 2 with 0s
112 packData(cl::EnqueueArgs(getQueue(), global, local), *sig_tmp.data,
113 sig_tmp.info, *sig.data, sig.info, sig_half_d0, sig_half_d0_odd);
114 CL_DEBUG_FINISH(getQueue());
115
116 blocks = divup(filter_packed_elem, THREADS);
117 global = cl::NDRange(blocks * THREADS);
118
119 // Pad filter array with 0s
120 padArray(cl::EnqueueArgs(getQueue(), global, local), *filter_tmp.data,
121 filter_tmp.info, *filter.data, filter.info);
122 CL_DEBUG_FINISH(getQueue());
123}
124
125template<typename convT, typename T>

Callers

nothing calls this directly

Calls 8

TemplateArgClass · 0.85
getNameFunction · 0.85
packDataFunction · 0.85
EnqueueArgsClass · 0.85
padArrayFunction · 0.85
calcParamSizesFunction · 0.70
getKernelFunction · 0.50
getQueueFunction · 0.50

Tested by

no test coverage detected