使用 clFFT 在二维上进行 1D FFT
1D FFT on second dimension with clFFT
我正在尝试使用 clFFT 库对二维数组的外部维度执行复杂的一维 FFT。
使用 NxM 数组,其中 M 是内部维度(在内存中连续),我想对 N 进行 FFT。我认为我可以通过将步幅设置为 M 来完成此操作。但是,当 M 是2,对于 m=0,FFT 是预期的,但对于 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
总结
You do multiple 1Ds with each 1D at a time. or You do batched 1D
with many 1D simultaneously.
Both of the two cases, you need to carefully offset your input buffer
and output buffer to make sure it is pointing to the correct address.
当我将步幅(clfftSetPlanInStride 和 clfftSetPlanOutStride)、批量大小(clfftSetPlanBatchSize)设置为 M 并将距离(clfftSetPlanDistance)设置为 1 时,它工作正常。
我正在尝试使用 clFFT 库对二维数组的外部维度执行复杂的一维 FFT。
使用 NxM 数组,其中 M 是内部维度(在内存中连续),我想对 N 进行 FFT。我认为我可以通过将步幅设置为 M 来完成此操作。但是,当 M 是2,对于 m=0,FFT 是预期的,但对于 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
总结
You do multiple 1Ds with each 1D at a time. or You do batched 1D with many 1D simultaneously.
Both of the two cases, you need to carefully offset your input buffer and output buffer to make sure it is pointing to the correct address.
当我将步幅(clfftSetPlanInStride 和 clfftSetPlanOutStride)、批量大小(clfftSetPlanBatchSize)设置为 M 并将距离(clfftSetPlanDistance)设置为 1 时,它工作正常。