我现在只需要显示矩阵乘法的中间进度.
for(unsigned int col=0; col<mtxSize; col++) {
unsigned tmp = 0;
for(unsigned int row=0; row<mtxSize; row++) {
for(unsigned int idx=0; idx<mtxSize; idx++) {
tmp += h_A[col*mtxSize+idx] * h_B[idx*mtxSize+row];
}
h_Rs[col*mtxSize+row] = tmp;
tmp = 0;
int rate_tmp = (col*mtxSize + (row+1))*100;
// Maybe like this...
fprintf(stdout, "Progress : %d.%d %%\r", rate_tmp/actMtxSize, rate_tmp%actMtxSize);
fflush(stdout);
}
}
Run Code Online (Sandbox Code Playgroud)
在主机代码(使用CPU)的情况下,它很容易,因为它顺序处理,所以我们可以很容易地检查.
但是在GPU并行处理的情况下,我该怎么办?
内核运行后,在完成内核执行之前不会返回.
所以我无法在内核执行期间检查中间数据.
我想我需要使用异步内核调用,但我不太清楚.
即使使用了异步内核调用,要将所有数据看到处理器上的几个块,我是否必须编写atomicAdd()(换句话说,全局内存访问)函数,其中包括一些开销?
给我一些建议或提示.
我想知道CUDA的情况.
我有一个蒙特卡罗模拟,其中系统的状态是一个位串(大小为N),位随机翻转.为了加速模拟,修改了代码以使用CUDA.但是由于我需要从系统状态计算大量的统计数据(如N ^ 2),这部分需要在有更多内存的CPU上完成.目前算法如下所示:
loop
CUDA kernel making 10s of Monte Carlo steps
Copy system state back to CPU
Calculate statistics
Run Code Online (Sandbox Code Playgroud)
这是低效的,我希望内核持续运行,而CPU偶尔会查询系统状态并在内核继续运行时计算统计信息.
根据汤姆对这个问题的回答,我认为答案是双缓冲,但我无法找到解释或如何做到这一点的例子.
如何在Tom的CUDA/C++代码答案的第三段中设置双缓冲?