それぞれサイズ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
.
.
}