Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencl 在主存和GPU内存之间传输数据需要多长时间?_Opencl_Gpu_Gpgpu - Fatal编程技术网

Opencl 在主存和GPU内存之间传输数据需要多长时间?

Opencl 在主存和GPU内存之间传输数据需要多长时间?,opencl,gpu,gpgpu,Opencl,Gpu,Gpgpu,GPU对我来说是新的。这个OpenCL代码片段说它在7毫秒内将7mb传输到GPU。这听起来是对的还是我遗漏了什么 const int dim1Size = 960000; int* dim1 = new int[dim1Size]; int* dim2 = new int[dim1Size]; long size = sizeof(int)*dim1Size*2; size = size / 1024 / 1024; cout << size << "mb to tran

GPU对我来说是新的。这个OpenCL代码片段说它在7毫秒内将7mb传输到GPU。这听起来是对的还是我遗漏了什么

const int dim1Size = 960000;
int* dim1 = new int[dim1Size];
int* dim2 = new int[dim1Size];
long size = sizeof(int)*dim1Size*2;
size = size / 1024 / 1024;
cout << size << "mb to transfer" << endl;

cl_mem mem_d1 = clCreateBuffer(*context, 0, sizeof(int)*dim1Size, NULL, NULL);
cl_mem mem_d2 = clCreateBuffer(*context, 0, sizeof(int)*dim1Size, NULL, NULL);

GetSystemTime(&time);
WORD start = (time.wSecond * 1000) + time.wMilliseconds;
clEnqueueWriteBuffer(*queue, mem_d1, CL_TRUE, 0, sizeof(int)*dim1Size, dim1, 0, NULL, NULL);
clEnqueueWriteBuffer(*queue, mem_d2, CL_TRUE, 0, sizeof(int)*dim1Size, dim2, 0, NULL, NULL);
GetSystemTime(&time);
WORD end = (time.wSecond * 1000) + time.wMilliseconds;
cout << (end - start) << "ms to transfer";
const int dim1Size=960000;
int*dim1=新int[dim1Size];
int*dim2=新int[dim1Size];
长尺寸=尺寸(整数)*dim1Size*2;
大小=大小/1024/1024;

cout1MBps对于任何可以运行OpenCL的GPU来说都是非常慢的。然而,如果我们仔细观察这些数字,我们可能会得到一些不同的结果

首先,您的示例并没有推动7MB,而是推动了两个缓冲区,每个缓冲区3.66MB。它们加在一起是7.32MB,这并不是一个很大的区别,但仍然是一个区别

然而,该代码中存在更大的不确定性。您正在使用GetSystemTime()。它以毫秒精度报告时间,但不能保证粒度。事实上,如果没有要求更高粒度的进程,您将获得高达55毫秒的精度。这很可能是您的代码发生的情况。下面是一个快速示例,可用于计算当前GetSystemTime()粒度:

SYSTEMTIME t1, t2;
GetSystemTime(&t1);
do {
    GetSystemTime(&t2);
} while (0 == memcmp(&t1, &t2, sizeof(SYSTEMTIME)));
std::cout << "timer granularity is " << t2.wMilliseconds - t1.wMilliseconds << " milliseconds" << std::endl;
SYSTEMTIME t1,t2;
GetSystemTime(&t1);
做{
GetSystemTime(&t2);
}而(0==memcmp(&t1,&t2,sizeof(SYSTEMTIME));

哇!我觉得听起来很快。这是一台较旧的工作计算机,所以也许这就是为什么它听起来很慢的原因。实际上,opencl运行时不处理是否使用主内存吗?因此,在这种情况下,它可能永远不会真正传输到gpu内存?PCI-E3.0带宽超过5GB/s,超过5MB/ms,超过35MB/7ms,但你的是旧的,所以PCI-E2.0几乎是17MB/7ms的一半,你说它是7mb/7ms,所以它可能更旧,所以你可能是对的。如果您的卡支持cl/gl互操作,则您可以在卡中进行计算,这样就不会复制。