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

时间:2014-03-15 22:17:04

标签: cuda

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

1 个答案:

答案 0 :(得分:3)

  

如果我将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,但我还没有对其进行测试。