我试图计算每个大小为20000的450个向量之间的互相关 . 在CPU上执行此操作时,我将数据存储在2D矩阵中,行= 20000且cols = 450 .
计算的序列代码如下
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)的矩阵 . 组织如下
<--- n样本f1 ---> <--- n样本f2 ---> <--- n样本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 回答
好像我找到了自己问题的答案 . 我有以下实验 . 我已经改变了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 = 150秒
Z = 2000; CPU = 401S; GPU = 203S
很明显,随着计算量的增加,GPU能够比CPU更好地扩展 .