gpt4 book ai didi

cudaMemcpy 太慢

转载 作者:行者123 更新时间:2023-12-04 03:16:50 30 4
gpt4 key购买 nike

我用 cudaMemcpy()一次将 1GB 的数据精确复制到设备。这需要 5.9 秒。反之则需要 5.1 秒。这是正常的吗?函数本身在复制之前有这么多开销吗?
理论上,PCIe 总线的吞吐量至少应为 4GB/s。
没有内存传输重叠,因为 Tesla C870 不支持它。任何提示?

编辑 2:我的测试程序 + 更新的时间;我希望它不会太多阅读!cutCreateTimer()函数不会为我编译:'错误:标识符“cutCreateTimer”未定义'-这可能与机器上安装的旧 cuda 版本(2.0)有关

 __host__ void time_int(int print){
static struct timeval t1; /* var for previous time stamp */
static struct timeval t2; /* var of current time stamp */
double time;
if(gettimeofday(&t2, 0) == -1) return;
if(print != 0){
time = (double) (t2.tv_sec - t1.tv_sec) + ((double) (t2.tv_usec - t1.tv_usec)) / 1000000.0;
printf(...);
}
t1 = t2;
}

main:
time(0);
void *x;
cudaMallocHost(&x,1073741824);
void *y;
cudaMalloc(&y, 1073741824);
time(1);
cudaMemcpy(y,x,1073741824, cudaMemcpyHostToDevice);
time(1);
cudaMemcpy(x,y,1073741824, cudaMemcpyDeviceToHost);
time(1);

显示的时间是:
0.86 秒分配
0.197 s 第一个副本
5.02秒第二次复制
奇怪的是:虽然它在第一次复制时显示 0.197 秒,但如果我观察程序运行,它需要更长的时间。

最佳答案

是的,这是正常的。 cudaMemcpy()做了很多检查和工作(如果主机内存是由通常的 malloc()mmap() 分配的)。它应该检查每一页数据是否在内存中,并将这些页(一个一个)移动到驱动程序。

您可以使用 cudaHostAlloc function cudaMallocHost 用于分配内存而不是 malloc .它将分配 固定 内存始终存储在 RAM 中,可以直接由 GPU 的 DMA 访问(更快 cudaMemcpy())。从第一个链接引用:

Allocates count bytes of host memory that is page-locked and accessible to the device. The driver tracks the virtual memory ranges allocated with this function and automatically accelerates calls to functions such as cudaMemcpy().



唯一的限制因素是系统中固定内存的总量是有限的(不超过 RAM 大小;最好使用不超过 RAM - 1Gb ):

Allocating excessive amounts of pinned memory may degrade system performance, since it reduces the amount of memory available to the system for paging. As a result, this function is best used sparingly to allocate staging areas for data exchange between host and device.

关于cudaMemcpy 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7430003/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com