| 99 | |
| 100 | template<typename T, typename aT> |
| 101 | void convolve_1d(conv_kparam_t& p, Param<T> out, CParam<T> sig, CParam<aT> filt, |
| 102 | const bool expand) { |
| 103 | auto convolve1 = common::getKernel( |
| 104 | "arrayfire::cuda::convolve1", {{convolve1_cuh_src}}, |
| 105 | TemplateArgs(TemplateTypename<T>(), TemplateTypename<aT>(), |
| 106 | TemplateArg(expand)), |
| 107 | {{DefineValue(MAX_CONV1_FILTER_LEN), DefineValue(CONV_THREADS)}}); |
| 108 | |
| 109 | prepareKernelArgs<T>(p, out.dims, filt.dims, 1); |
| 110 | |
| 111 | size_t filterSize = filt.dims[0] * sizeof(aT); |
| 112 | |
| 113 | for (int b3 = 0; b3 < filt.dims[3]; ++b3) { |
| 114 | int f3Off = b3 * filt.strides[3]; |
| 115 | |
| 116 | for (int b2 = 0; b2 < filt.dims[2]; ++b2) { |
| 117 | int f2Off = b2 * filt.strides[2]; |
| 118 | |
| 119 | for (int b1 = 0; b1 < filt.dims[1]; ++b1) { |
| 120 | int f1Off = b1 * filt.strides[1]; |
| 121 | const aT* fptr = filt.ptr + (f1Off + f2Off + f3Off); |
| 122 | |
| 123 | // FIXME: case where filter array is strided |
| 124 | auto constMemPtr = convolve1.getDevPtr(conv_c_name); |
| 125 | convolve1.copyToReadOnly(constMemPtr, |
| 126 | reinterpret_cast<CUdeviceptr>(fptr), |
| 127 | filterSize); |
| 128 | |
| 129 | p.o[0] = (p.outHasNoOffset ? 0 : b1); |
| 130 | p.o[1] = (p.outHasNoOffset ? 0 : b2); |
| 131 | p.o[2] = (p.outHasNoOffset ? 0 : b3); |
| 132 | p.s[0] = (p.inHasNoOffset ? 0 : b1); |
| 133 | p.s[1] = (p.inHasNoOffset ? 0 : b2); |
| 134 | p.s[2] = (p.inHasNoOffset ? 0 : b3); |
| 135 | |
| 136 | EnqueueArgs qArgs(p.mBlocks, p.mThreads, getActiveStream(), |
| 137 | p.mSharedSize); |
| 138 | convolve1(qArgs, out, sig, filt.dims[0], p.mBlk_x, p.mBlk_y, |
| 139 | p.o[0], p.o[1], p.o[2], p.s[0], p.s[1], p.s[2]); |
| 140 | POST_LAUNCH_CHECK(); |
| 141 | } |
| 142 | } |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | template<typename T, typename aT> |
| 147 | void conv2Helper(const conv_kparam_t& p, Param<T> out, CParam<T> sig, |
nothing calls this directly
no test coverage detected