2013-01-31 44 views
1

我正試圖計算每個大小爲20000的450個向量之間的互相關。 在CPU上執行此操作時,我將數據存儲在行數= 20000和cols = 450的二維矩陣中。對於使用OpenMP的CPU,CUDA不那麼快?

的計算中的串行代碼看起來像

void computeFF_cpu(float * nSamples, float * nFeatures, float ** data, float ** corr 
     #pragma omp parallel for shared(corr, data) 
     for(int i=0 ; i<nFeatures ; i++) 
     { 
      for(int j=0 ; j<nFeatures ; j++) 
       corr[i][j] = pearsonCorr(data[i], data[j], nSamples); 
     } 

int main() 
{ 
. 
. 
**for(int z=0 ; z<1000 ; z++)** 
computeFF_cpu(20000, 450, data, corr); 
. 
. 
} 

這完美的作品。現在我試圖用GPU解決這個問題。我已將2D數據矩陣轉換爲GPU內存中的行主格式,並且已驗證副本是否正確創建。

向量以行格式存儲爲大小爲900000(即450 * 20000)的矩陣。安排如下
< --- F1的NSAMPLES ---> < --- F2的NSAMPLES ---> < --- NSAMPLES F3 ---> ......

我CUDA的計算互相關的代碼如下

// kernel for computation of ff 
    __global__ void computeFFCorr(int nSamples, int nFeatures, float * dev_data, float * dev_ff) 
    { 
     int tid = blockIdx.x + blockIdx.y*gridDim.x; 
     if(blockIdx.x == blockIdx.y) 
     dev_ff[tid] = 1.0; 
     else if(tid < nFeatures*nFeatures) 
     dev_ff[tid] = pearsonCorrelationScore_gpu(dev_data+(blockIdx.x*nSamples), dev_data+(blockIdx.y*nSamples), nSamples); 
    } 

    main() 
    { 
    . 
    . 
     // Call kernel for computation of ff 
**for(int z=0 ; z<1000 ; z++)** 
     computeFFCorr<<<dim3(nFeatures,nFeatures),1>>>(nSamples, nFeatures, dev_data, corr); 
     //nSamples = 20000 
     // nFeatures = 450 
     // dev_data -> data matrix in row major form 
     // corr -> result matrix also stored in row major 
    . 
    . 
    } 
+0

你確定在這種情況下,「每塊只有1個線程可能導致的低效率」真的可以忽略嗎?如果您使用較小的輸入空間,代碼實際上是否會完成運行? – talonmies

+0

好,程序在2分鐘左右完成。你如何建議在樣本中平行進入N條線(比如說)?我無法真正地思考。我是cuda – mkuse

+0

的新手,很明顯,這個問題很明顯。如果發生死鎖,代碼將永遠不會完成。沒有死鎖。這只是非常緩慢。我將首先解決問題以反映問題的真實性質。 – talonmies

回答

1

好像我找到了自己的問題的答案。我有以下的實驗。我已經改變了z的值(即函數被執行的次數)。這種方法在cuda標籤下的stackoverflow中的前幾篇文章中提到過。

下面是表 -

  • Z = 100; CPU = 11s; GPU = 14s
  • Z = 200; CPU = 18s; GPU = 23s
  • Z = 300; CPU = 26s; GPU = 34s
  • Z = 500; CPU = 41s; GPU = 53s
  • Z = 1000; CPU = 99s; GPU = 101s
  • Z = 1500; CPU = 279s; GPU = 150s
  • Z = 2000; CPU = 401S; GPU = 203s

很明顯,隨着計算數量的增長,GPU可以比CPU更好地擴展。