代码之家  ›  专栏  ›  技术社区  ›  Ken Y-N

CUDA默认流和每个线程的CUDA API默认流

  •  0
  • Ken Y-N  · 技术社区  · 7 年前

    The documentation here 尝试解释如何处理默认流。

    给定的代码如下(忽略分配错误):

    char *ptr;
    char source[1000000];
    cudaMalloc((void**)&ptr, 1000000);
    cudaMemcpyAsync(ptr, source, 1000000, cudaMemcpyHostToDevice);
    myKernel<<<1000, 1000>>>(ptr);
    

    有没有风险 myKernel 将在之前开始 cudaMemcpyAsync 完成复制?我认为“不”,因为这是文档中描述的“遗留默认流”。

    但是,如果我使用 CUDA_API_PER_THREAD_DEFAULT_STREAM 会发生什么“每线程默认流”的文本显示:

    每个线程的默认流是线程和 CUcontext ,它不与其他流同步(就像显式创建的流一样)。每个线程的默认流不是非阻塞流,如果在程序中同时使用这两个流,则将与旧的默认流同步。

    我想这也可以 Cudammcpyasync公司 我的心 有效利用 CU_STREAM_PER_THREAD ;我说的对吗?


    我问的原因是我在内核中有一个非常奇怪的间歇性cuda错误77,我只能用 Cudammcpyasync公司 打电话前未完成 我的心 ,这意味着我不理解文档。不过,真正的代码太复杂,太专有,无法生成mcve。

    1 回复  |  直到 7 年前
        1
  •  1
  •   talonmies    7 年前

    我的内核在cudammcpyasync之前启动有风险吗 完成复制?我认为“不”,因为这是“遗留违约” “流”,如文档中所述。

    不,这不可能发生,因为正如您所注意到的,遗留默认流(流0)在所有情况下都是阻塞的。

    但是,如果我使用cuda_api_per_thread_default_stream编译,会发生什么情况?

    几乎没什么变化每个线程的默认流没有阻塞,因此其他流和使用其默认流的其他线程可以在上下文中并发操作然而,这两个操作仍然在同一流中,并且彼此是连续的两个操作之间唯一可能发生重叠的方法是 source 是一个不可分页的内存分配,它允许在传输和内核执行之间重叠。否则,它们将按顺序运行,因为流的顺序属性和主机源内存施加的限制。

    如果怀疑操作的意外重叠确实有问题,应该可以通过分析来确认这一点。