我已经开始学习cuda一段时间了,我有以下问题
看看我在下面是怎么做的:
复制 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
.
我希望复制时间应该独立于需要分配 Matrix 值的内部迭代dev_B
。
此外,我希望从 CPU 复制相同矩阵的时间将具有相同的顺序。
你知道有什么问题吗?