1

それぞれサイズ20000の450個のベクトル間の相互相関を計算しようとしています。これをCPUで実行している間、rows=20000およびcols=450の2D行列にデータを保存しました。

計算のシリアルコードは次のようになります

    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)の行列として格納されます。次のように構成されています
<---nSamplesof f1 ---> <--- nSamples of f2 ---> <--- nSamples of 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
    .
    .
    }
4

1 に答える 1

1

私自身の質問に対する答えを見つけたようです。次の実験があります。z の値 (つまり、関数が実行される回数) を変更しました。この種のアプローチは、cuda タグの下の stackoverflow に関する以前の投稿のいくつかで提案されました。

ここに表があります -

  • Z=100; CPU=11秒; GPU=14秒
  • Z=200; CPU=18秒; GPU=23秒
  • Z=300; CPU=26秒; GPU=34秒
  • Z=500; CPU=41秒; GPU=53秒
  • Z=1000; CPU=99秒; GPU=101秒
  • Z=1500; CPU=279 秒; GPU=150秒
  • Z=2000; CPU=401; GPU=203秒

計算の数が増えるにつれて、GPU が CPU よりもはるかに優れたスケーリングを行えることは明らかです。

于 2013-02-01T13:07:00.813 に答える