【发布时间】:2014-04-21 05:54:42
【问题描述】:
如果我从主机内存调用 cudaMemcpy 到主机内存,它会先同步设备吗? cuda memcpy调用和普通C++函数memcpy有什么区别吗?我知道如果我想在主机到主机之间进行 memcpy 2D,我必须使用 cuda 调用,因为 C++ 中没有这样的功能。还有其他的吗?
【问题讨论】:
标签: cuda
如果我从主机内存调用 cudaMemcpy 到主机内存,它会先同步设备吗? cuda memcpy调用和普通C++函数memcpy有什么区别吗?我知道如果我想在主机到主机之间进行 memcpy 2D,我必须使用 cuda 调用,因为 C++ 中没有这样的功能。还有其他的吗?
【问题讨论】:
标签: cuda
如果我从主机内存调用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,但我还没有测试过。
【讨论】:
cudaMemcpyAsync() 的最后评论吗?我的意思是,看起来您可能能够运行与 CPU 异步的 memcpy()(就好像您在另一个 CPU 线程或进程中运行它一样)。