2011-05-11 113 views
0

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

感謝,
薩揚

+0

你會得到什麼結果?如果您將'Vol_AUTOCORR [g​​id] = sum;'更改爲'Vol_AUTOCORR [g​​id] = gid;',是否會給您預期的遞增值數組? – 2011-05-11 22:17:44

+0

我在這裏沒有看到問題?你的主機代碼是什麼?您是否將數據正確傳輸到設備並返回? – 2011-05-13 15:21:36

+0

很抱歉,對於最近的回覆......內核沒有任何問題,我在主機代碼中出錯,導致結果出錯。感謝您的評價。 – Sayan 2011-05-16 01:40:16

回答

1

的代碼是正確的。據我所知,這應該運行良好,並給出相應的結果。

barrier(CLK_GLOBAL_MEM_FENCE);不需要。沒有這句話你會得到更多的速度。

你的問題應該在內核之外,檢查你是否正確地傳遞了輸入,並且你正在從GPU中取出正確的數據。

順便說一句,我建議你使用雙精度支持GPU,因爲你正在做雙計算。 檢查您是否傳遞了雙值。請記住,您不能將浮點指針指向double值,反之亦然。這會給你錯誤的結果。

+0

是的,我注意到在這種情況下不需要BARRIER。感謝您指點我的數據類型。 – Sayan 2011-05-26 05:06:36