相关疑难解决方法(0)

是否可以运行持久的cuda内核并异步与cpu通信?

据我所知,Cuda流和memorycpyasync需要我们为不同的流标记不同的内核,内存操作,以使gpu操作与cpu操作并发.

但是有可能有一个持久内核.这个内核启动一次,永远循环,检查"一些标志",看看是否有来自CPU然后对其进行操作的数据.当这个"片段"数据完成时,GPU为CPU设置"标志",CPU看到它并将数据复制回来.这个内核永远不会运行.

当前的cuda编程模型中是否存在这种情况?我能得到的最接近的是什么?

c c++ cpu cuda gpu

7
推荐指数
1
解决办法
1528
查看次数

如何检查矩阵乘法的进度?

我现在只需要显示矩阵乘法的中间进度.

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的情况.

cuda

4
推荐指数
1
解决办法
2251
查看次数

使用CUDA在GPU上进行图像处理的多线程

问题陈述: 我必须连续处理从相机捕获的8百万像素图像。上面必须有几种图像处理算法,例如颜色插值,颜色转换等。这些操作在CPU上将花费很长时间。因此,我决定使用CUDA内核在GPU上执行这些操作。我已经编写了可工作的CUDA内核用于颜色转换。但是我仍然需要进一步提高性能。

基本上有两个计算时间:

  1. source image从CPU 复制到GPU,反之亦然
  2. source imageGPU的处理

当图像从CPU复制到GPU时...。同样,当在GPU上处理图像时,其他任何事情都不会发生。

我的想法:我想进行多线程处理,以便节省时间。我想在GPU上进行前一张图像的处理时捕获下一张图像。并且,当GPU完成前一个图像的处理时,下一个图像已经在那里,可以将其从CPU传输到GPU。

我需要什么:我对多线程世界完全陌生。我正在看一些教程和其他一些东西,以了解更多有关它的信息。因此,我正在寻找有关适当步骤和适当逻辑的一些建议。

c++ multithreading

-1
推荐指数
1
解决办法
2690
查看次数

标签 统计

c++ ×2

cuda ×2

c ×1

cpu ×1

gpu ×1

multithreading ×1