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