我正在尝试计算每个大小为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)的矩阵。组织如下
&lt; --- n的样本f1 ---&gt;&lt; --- n的样本f2 ---&gt;&lt; --- nSamples of f3 ---&gt; ......
我计算互相关的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)
似乎我找到了自己问题的答案。我有以下实验。我已经改变了z的值(即执行函数的次数)。在cuda标签下的stackoverflow上的几篇文章中提出了这种方法。
这是表格 -
很明显,随着计算量的增加,GPU能够比CPU更好地扩展。