【发布时间】:2013-02-01 21:08:03
【问题描述】:
我正在尝试计算 450 个向量之间的互相关,每个向量的大小为 20000。 在 CPU 上执行此操作时,我将数据存储在 rows=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)的矩阵。整理如下
......
我计算互相关的 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 个线程可能导致的低效率”在这种情况下真的可以忽略吗?如果您使用较小的输入空间,代码是否真正运行完成?
-
好吧,程序在大约 2 分钟内完成。您如何建议在样本中并行化成 N 个线程(例如)?我真的无法思考。我是 cuda 的新手
-
嗯,这清楚地回答了你的问题。如果出现死锁,代码将永远无法完成。没有僵局。它只是非常缓慢。我将首先解决问题以反映问题的真实性质。
-
@talonmies 在这方面您还需要什么信息?我在这里想要完成的是特征-特征相关性。我的意思是,我有一个大小为 20000x450 的二维矩阵。其中每一行代表一个向量。我需要找到另一个矩阵来给出每对向量的相关性。
-
我的意思是您的整个问题都基于您的代码永远不会完成或存在某种死锁的想法。但显然情况并非如此。你的问题是“这有什么问题,是死锁吗?”。答案是“没有错,只是慢,而且你已经知道为什么了”。如果你真的想问一个不同的问题,那么请继续编辑你的问题。