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
.
.
}
你確定在這種情況下,「每塊只有1個線程可能導致的低效率」真的可以忽略嗎?如果您使用較小的輸入空間,代碼實際上是否會完成運行? – talonmies
好,程序在2分鐘左右完成。你如何建議在樣本中平行進入N條線(比如說)?我無法真正地思考。我是cuda – mkuse
的新手,很明顯,這個問題很明顯。如果發生死鎖,代碼將永遠不會完成。沒有死鎖。這只是非常緩慢。我將首先解決問題以反映問題的真實性質。 – talonmies