我认为在计算卷积时Matlab会慢得多。当我在我的OpenCL代码中尝试它时,使用conv
函数时,OpenCL程序的速度几乎是Matlab的两倍。
这是预期的还是我的OpenCL上的代码没有优化?
这是我在SO上找到的openCL代码。这是针对内核的
__kernel void lowpass(__global float *Array, __global float *coefficients, __global float *Output, __const int numOfCoefficients) {
int globalId = get_global_id(0);
float sum=0.0f;
int min_i= max((numOfCoefficients-1),globalId)-(numOfCoefficients-1);
int max_i= min_i+numOfCoefficients;
for (int i=min_i; i< max_i; i++)
{
sum +=Array[i]*coefficients[globalId-i];
}
Output[globalId]=sum;
}
matlab代码很简单,其中h是低通滤波器的系数,y是输入
y2=conv(h,y);
我正在做的是将具有大约512个抽头的低通滤波器应用于具有80000000个样本的输入。 Matlab使用conv
函数需要1.6秒,而opencl需要3.2。
修改 所以这是在具有10个计算核心和1Gb内存的AMD GPU上运行。有一个输入数组由80000000个样本组成,这些样本被传递到内核,以及在MatLab中为低通滤波器的特定截止频率生成的系数数组。 Output变量也是写入值的位置。
Matlab与opencl的结果完全相同,我使用的是wav文件,所以我可以听一听。另外,在检查Matlab和OpenCL生成的wav文件的属性时,它们都带有完全相同的信息。