我正在尝试使用 clFFT 库在 2D 数组的外部维度上执行复杂的 1D FFT。
使用一个 NxM 数组,其中 M 是内部维度(在内存中连续(,我想将 FFT 超过 N。我想我可以通过将步幅设置为 M 来实现这一点。然而,当 M 为 2 时,FFT 在 m=0 时符合预期,但对于 m=1 是未知的。任何想法将不胜感激。
以下是我对计划设置的内容:
cl_context context;
dev->get_gr_opencl_interface()->get_platform().opencl_context(context);
size_t fft_length_size_t[] = {fft_length}; // N
err = clfftCreateDefaultPlan(&m_plan_handle, context, CLFFT_1D, fft_length_size_t);
if(err != CL_SUCCESS)
{
std::cout << "clFFT clfftCreateDefaultPlan Failed." << std::endl;
}
size_t fft_stride_size_t[] = {fft_stride}; // M
err = clfftSetPlanPrecision(m_plan_handle, CLFFT_SINGLE);
err |= clfftSetLayout(m_plan_handle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
err |= clfftSetResultLocation(m_plan_handle, CLFFT_OUTOFPLACE);
err |= clfftSetPlanBatchSize(m_plan_handle, batch_size); // Currently 1
err |= clfftSetPlanInStride(m_plan_handle, CLFFT_1D, fft_stride_size_t);
err |= clfftSetPlanOutStride(m_plan_handle, CLFFT_1D, fft_stride_size_t);
if(err != CL_SUCCESS)
{
std::cout << "clFFT Plan Configuration Failed." << std::endl;
感谢 clmath 论坛上的董廷兴回答:
https://groups.google.com/forum/#!topic/clmath/hWppfghKvN4
总结
您可以一次对每个 1D 执行多个 1D。 或你做批处理 1D 同时具有许多1D。
这两种情况,您都需要小心地偏移输入缓冲区 和输出缓冲区,以确保它指向正确的地址。
当我将步幅(clfftSetPlanInStride 和 clfftSetPlanOutStride(、批大小 (clfftSetPlanBatchSize( 设置为 M 并将距离 (clfftSetPlanDistance( 设置为 1 时,它工作正常。