| 66 | |
| 67 | template<typename convT, typename T> |
| 68 | void 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 | |
| 125 | template<typename convT, typename T> |
nothing calls this directly
no test coverage detected