版主及大牛们,我是CUDA编程菜鸟,想请教一些困惑已久的问题:
(1)将数据从CPU传到GPU的global存储器上,调用完内核函数后,如果不释放global存储器的话,原来的数据是不是还在那里,下次如果再调用新的内核函数的话,可不可以继续使用原来已经存在global上的数据。
(2)如何实现一次数据传输,多次调用内核函数,就是说进行一次数据传输,多次调用内核函数进行计算。
谢谢!!
你好:
1.是的,只要不释放/程序不结束,global上的数据还在那里。
2.一次数据传输,多次调用内核例子如下:
float dA;
cudaMalloc((void*)&dA,size_A);
cudaMemcpy(dA,hA,size_A,cudaMemcpyHostToDevice);
kernel1<<<grid1,block1>>>(dA,…);
…
kerneln<<<gridn,blockn>>>(dA,…);
cudaMemcpy(hA,dA,size_A,cudaMemcpyDeviceToHost);
…
谢谢你的回复!还有个问题就是,很多CUDA书上都是尽量减少数据传输,多在GPU上进行计算,我想问的是如何做到这点呢,是不是就是说的这个啊?还有其他的办法吗?还有是不是和算法本身有很大的关系呢?
楼主你好,你说的对,以上是其中的一种方法——即一次传输,多步计算。
还有一些就是和算法相关的了,比如你可以通过算法安排,减少需要传入/传出(两者或之一)的数据规模。
举个例子:
比如规约求和操作:传入1M个数据,在GPU内规约求和,然后只传出一个数据。这样也能减少传输。
(此处仅仅是举例。规约求和的数据传输:计算量不一定适合应用GPU计算,请勿深究)
感谢yixi的答复,基本上LZ的问题就是这样了。
稍微需要补充的是,除了将数据尽量保留在显存(一般指global memory)里面,而不是来回和host memory反复copy以外,对于已经读入寄存器的数值和/或已经读入shared memory里面的数据,尽量反复使用,这样做也是尽量减少数据传输的做法。
祝LZ编码顺利~
谢谢版主的补充回复!
不客气的,欢迎您常来论坛,祝您编码顺利~