【发布时间】:2013-12-09 05:47:53
【问题描述】:
我正在尝试使用 CUDA 解决高斯消元问题。
我有一个N*N 矩阵。为了得到这个矩阵的新元素,我使用下面的 CPU 代码,其中C.width=N:
for(int z=0; z< C.width-1; z++)
{
for ( int c = z+1 ; c < C.width ; c++ )
{
for (int d = z ; d < C.width ; d++ )
{
C.elements[c*C.width+d]=C.elements[c*C.width+d] - (B.elements[c*C.width+z]*C.elements[z*C.width+d]);
}
}
}
我正在尝试使用 CUDA 来实现它。例如,对于N=512
dim3 dimBlock(16,16,1);
dim3 dimGrid(32,32,1);
MatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C);
我认为对于每次迭代我都应该使用N-i*N 线程来计算元素更新,即
if(idx>511 || idy>510)
return;
for(int i=1; i<512;i++)
{
if(idx>=i-1 && idy>=i-1)
C.elements[(idy+1)*C.width+idx]=C.elements[(idy+1)*C.width+idx]-((C.elements[(idy+1)*C.width+(i-1)]/C.elements[(i-1)*C.width+(i-1)])*C.elements[(i-1)*C.width+idx]);
__syncthreads();
}
}
在GPU和CPU上得到的结果是一样的,但是处理时间是Time(CPU)=2*Time(GPU)
对于N=512:Time(CPU) = 1900 ms; Time(GPU) = 980 ms
对于N=1024:Time(CPU) = 14000 ms;时间(GPU)= 7766 毫秒`
.
.
.
我认为加速应该比我现在的要大。我的并行代码有什么错误吗?你能帮我改写我的代码吗?
感谢您的帮助!
【问题讨论】:
-
我可能不明白您要做什么,我远非 CUDA 专家,但您似乎在单个数学语句后同步线程。我想你会发现共享内存和线程同步的开销将抵消并行实现的大部分收益。