【问题标题】:Does cuda memcpy from host to host perform synchronization?从主机到主机的 cuda memcpy 是否执行同步?
【发布时间】:2014-04-21 05:54:42
【问题描述】:

如果我从主机内存调用 cudaMemcpy 到主机内存,它会先同步设备吗? cuda memcpy调用和普通C++函数memcpy有什么区别吗?我知道如果我想在主机到主机之间进行 memcpy 2D,我必须使用 cuda 调用,因为 C++ 中没有这样的功能。还有其他的吗?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    如果我从主机内存调用cudaMemcpy到主机内存,它会先同步设备吗?

    我验证了cudaMemcpy()cudaMemcpyHostToHost 确实与以下代码同步:

    #include <cuda.h>
    
    #define check_cuda_call(ans) { _check((ans), __FILE__, __LINE__); }
    inline void _check(cudaError_t code, char *file, int line)
    {
      if (code != cudaSuccess) {
        fprintf(stderr,"CUDA Error: %s %s %d\n", cudaGetErrorString(code), file, line);
        exit(code);
      }
    }
    
    __device__ clock_t offset;
    
    __global__ void clock_block(clock_t clock_count)
    {
      clock_t start_clock = clock();
      clock_t clock_offset = 0;
      while (clock_offset < clock_count) {
        clock_offset = clock() - start_clock;
      }
      offset = clock_offset;
    }
    
    int main(int argc, char *argv[])
    {
      int *A;
      check_cuda_call(cudaMallocHost(&A, 1 * sizeof(int)));
      int *B;
      check_cuda_call(cudaMallocHost(&B, 1 * sizeof(int)));
    
      clock_block<<<1,1>>>(1000 * 1000 * 1000);
    
      //check_cuda_call(cudaDeviceSynchronize());
      check_cuda_call(cudaMemcpy(&A, &B, 1 * sizeof(int), cudaMemcpyHostToHost));
    }
    

    由于内核启动后的阻塞调用,应用程序在我的卡上等待大约 1 秒。没有阻塞调用,它会立即退出。

    cuda memcpy调用和普通C++函数memcpy有区别吗?

    是的,同步也会导致 cudaMemcpy()cudaMemcpyHostToHost 能够从以前的异步调用中返回错误,这使得它不同于普通的 memcpy()

    我知道如果我想在主机到主机之间进行 memcpy 2D,我必须使用 cuda 调用,因为 C++ 中没有这样的功能。还有其他的吗?

    您也许可以使用cudaMemcpyAsync()cudaMemcpyHostToHost 在主机上进行复制而不会阻塞CPU,但我还没有测试过。

    【讨论】:

    • 天哪。如果您想要不同步的主机到主机 memcpy,调用 memcpy()!!
    • @ArchaeaSoftware,你指的是我对cudaMemcpyAsync() 的最后评论吗?我的意思是,看起来您可能能够运行与 CPU 异步的 memcpy()(就好像您在另一个 CPU 线程或进程中运行它一样)。
    • theinquirer.net/w-images/bfff8015-d483-4def-9bcb-11c1023f24b3/0/… 在 numa 系统中使用通过 pci-e 的额外 qpi 链接时,它是否会在并发 memcpy() 之上增加更多带宽?
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多