我已經寫了一個簡單的程序,如下所示執行自相關...我已經使用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