cuda memcpy 从主机到主机是否执行同步?

sha*_*l85 3 cuda

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

Rog*_*ahl 6

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

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

#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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 好主。如果你想要没有同步的主机到主机的 memcpy,*调用 memcpy()*!! (2认同)