我开始学习cuda有一段时间了,我遇到了以下问题
请看下面我的表现:
Copy GPU
int* B;
// ...
int *dev_B;
//initialize B=0
cudaMalloc((void**)&dev_B, Nel*Nface*sizeof(int));
cudaMemcpy(dev_B, B, Nel*Nface*sizeof(int),cudaMemcpyHostToDevice);
//...
//Execute on GPU the following function which is supposed to fill in
//the dev_B matrix with integers
findNeiborElem <<< Nblocks, Nthreads >>>(dev_B, dev_MSH, dev_Nel, dev_Npel, dev_Nface, dev_FC);
再次复制CPU
cudaMemcpy(B, dev_B, Nel*Nface*sizeof(int),cudaMemcpyDeviceToHost);
- 将数组 B 复制到 dev_B 只需要几分之一秒的时间。
然而,将数组 dev_B 复制回 B 需要很长时间。
-
findNeiborElem 函数涉及每个线程的循环
例如看起来像那样
__ global __ void findNeiborElem(int *dev_B, int *dev_MSH, int *dev_Nel, int *dev_Npel, int *dev_Nface, int *dev_FC){
int tid=threadIdx.x + blockIdx.x * blockDim.x;
while (tid<dev_Nel[0]){
for (int j=1;j<=Nel;j++){
// do some calculations
B[ind(tid,1,Nel)]=j// j in most cases do no go all the way to the Nel reach
break;
}
tid += blockDim.x * gridDim.x;
}
}
非常奇怪的是,将 dev B 复制到 B 的时间与 j 索引的迭代次数成正比。
例如如果Nel=5
那么时间大约是5 sec
.
当我增加Nel=20
时间大约是20 sec
.
我希望复制时间应该独立于分配矩阵值所需的内部迭代dev_B
.
另外,我预计从 CPU 复制相同矩阵到 CPU 的时间是相同的。
你知道出了什么问题吗?