gpt4 book ai didi

c++ - CUDA 流不并行运行

转载 作者:行者123 更新时间:2023-11-28 05:52:54 29 4
gpt4 key购买 nike

给定这段代码:

void foo(cv::gpu::GpuMat const &src, cv::gpu::GpuMat *dst[], cv::Size const dst_size[], size_t numImages)
{
cudaStream_t streams[numImages];
for (size_t image = 0; image < numImages; ++image)
{
cudaStreamCreateWithFlags(&streams[image], cudaStreamNonBlocking);
dim3 Threads(32, 16);
dim3 Blocks((dst_size[image].width + Threads.x - 1)/Threads.x,
(dst_size[image].height + Threads.y - 1)/Threads.y);
myKernel<<<Blocks, Threads, 0, streams[image]>>>(src, dst[image], dst_size[image]);
}
for (size_t image = 0; image < numImages; ++image)
{
cudaStreamSynchronize(streams[image]);
cudaStreamDestroy(streams[image]);
}
}

查看 nvvp 的输出,我看到几乎完美的串行执行,即使第一个流是一个漫长的过程,其他流应该能够与之重叠。

请注意,我的内核使用了 30 个寄存器,并且所有寄存器都报告了大约 0.87 的“已实现占用”。对于最小的图像,网格大小为 [10,15,1], block 大小为 [32, 16,1]。

最佳答案

描述并发内核执行限制的条件在 CUDA 编程指南 (link) 中给出,但其要点是只有当您的 GPU 有足够的资源时,您的 GPU 才有可能运行来自不同流的多个内核这样做。

在您的使用案例中,您说过您正在多次启动内核,其中包含 150 个 block ,每个 block 有 512 个线程。您的 GPU 有 12 个 SMM(我认为),并且每个 SMM 可以同时运行最多 4 个 block (4 * 512 = 2048 个线程,这是 SMM 的限制)。所以你的 GPU 最多只能同时运行 4 * 12 = 48 个 block 。当命令管道中多次启动 150 个 block 时,似乎几乎没有(甚至没有)并发内核执行的机会。

如果您通过减小块大小来增加内核的调度粒度,您可能能够鼓励内核执行重叠。较小的 block 比较大的 block 更有可能找到可用资源和调度槽。同样,减少每次内核启动的总 block 数(可能通过增加每个线程的并行工作)可能也有助于增加多个内核重叠或并发执行的可能性。

关于c++ - CUDA 流不并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34847798/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com