首页 文章

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

提问于
浏览
1

我试图计算每个大小为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 回答

  • 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更好地扩展 .

相关问题