我已经写了一个简单的程序,如下所示执行自相关...我已经使用pgi加速器指令将计算移动到GPU。OpenCL自相关内核
//autocorrelation
void autocorr(float *restrict A, float *restrict C, int N)
{
int i, j;
float sum;
#pragma acc region
{
for (i = 0; i < N; i++) {
sum = 0.0;
for (j = 0; j < N; j++) {
if ((i+j) < N)
sum += A[j] * A[i+j];
else
continue;
}
C[i] = sum;
}
}
}
我在OpenCL中写了一个类似的程序,但是我没有得到正确的结果。该程序如下...我是GPU编程的新手,除了可以解决我的错误的提示外,欢迎任何其他建议。
__kernel void autocorrel1D(__global double *Vol_IN, __global double *Vol_AUTOCORR, int size)
{
int j, gid = get_global_id(0);
double sum = 0.0;
for (j = 0; j < size; j++) {
if ((gid+j) < size)
{
sum += Vol_IN[j] * Vol_IN[gid+j];
}
else
continue;
}
barrier(CLK_GLOBAL_MEM_FENCE);
Vol_AUTOCORR[gid] = sum;
}
因为我已经通过了尺寸为1,所以我考虑get_global_size(0)调用会给我当前块,用于访问输入一维数组的ID。
感谢,
萨扬
你会得到什么结果?如果您将'Vol_AUTOCORR [gid] = sum;'更改为'Vol_AUTOCORR [gid] = gid;',是否会给您预期的递增值数组? – 2011-05-11 22:17:44
我在这里没有看到问题?你的主机代码是什么?您是否将数据正确传输到设备并返回? – 2011-05-13 15:21:36
很抱歉,对于最近的回复......内核没有任何问题,我在主机代码中出错,导致结果出错。感谢您的评价。 – Sayan 2011-05-16 01:40:16