【发布时间】:2012-10-31 17:36:52
【问题描述】:
我开始学习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。
我希望复制时间应该独立于需要分配矩阵dev_B 的值的内部迭代。
我还希望从 CPU 到 CPU 复制相同矩阵的时间将是相同的顺序。
你知道出了什么问题吗?
【问题讨论】:
标签: c++ performance parallel-processing cuda gpu