首页 文章

CUDA重叠数据传输和内核执行,流的隐式同步

提问于
浏览
1
  • 在"CUDA C Programming Guide"中阅读CUDA的"overlap of data transfer and kernel execution"部分之后,我有一个问题:数据传输到底是指什么?它包括 cudaMemsetAsynccudaMemcpyAsynccudaMemsetcudaMemcpy . 当然,为memcpy分配的内存是固定的 .

  • 在隐式同步(流)部分,本书说"a device memory set"可以序列化流 . 那么,它是指 cudaMemsetAsynccudaMemcpyAsynccudaMemcpycudaMemcpy ?我不确定 .

1 回答

  • 2

    任何带有 Async 的函数调用都有一个stream参数 . 此外,CUDA工具包提供的一些库也可以选择设置流 . 通过使用它,您可以同时运行多个流 .

    这意味着,除非您专门创建和设置流,否则您将使用defualt流 . 例如,没有默认的 data transferkernel execution 流 . 您将必须创建两个流(或更多),并为它们分配一个选择的任务 .

    常见的用例是编程指南中提到的两个流 . 请记住,这仅在您启动多个内核时才有用 . 在计算当前内核的结果时,您可以获取下一个(独立)内核或当前内核的下一次迭代所需的数据 . 这可以最大化计算和带宽功能 .

    对于您提到的函数调用, cudaMemcpycudaMemcpyAsync 是执行数据传输的唯一函数 . 我认为 cudaMemsetcudaMemsetAsync 可以被称为数据传输 .

    cudaMempyAsynccudaMemsetAsync 都可以与流一起使用,而 cudaMemsetcudaMemcpy 是阻止不使用流的调用 .

相关问题