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