使用OpenMP CUDA对CPU的速度不是很快?

时间:2013-01-31 19:41:19

标签: cuda gpu gpgpu gpu-programming

我正在尝试计算每个大小为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
    .
    .
    }

1 个答案:

答案 0 :(得分: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 = 53秒
  • Z = 1000; CPU = 99s; GPU = 101S
  • Z = 1500; CPU = 279s; GPU = 150S
  • Z = 2000; CPU = 401S; GPU = 203S

很明显,随着计算量的增加,GPU能够比CPU更好地扩展。