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

时间:2013-08-15 19:10:58

标签: opencl gpu gpgpu

GPU对我来说是新手。这个OpenCL片段称它在7ms内将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";

1 个答案:

答案 0 :(得分:1)

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

首先,你的样本没有推动7MB,它正在推动两个缓冲区,每个3.66MB。它们共有7.32MB,这并没有太大的区别,但仍然是一个区别。

然而,此代码存在更大的不确定性。你正在使用GetSystemTime()。它以毫秒精度报告时间,但不保证粒度。事实上,如果没有要求更高粒度的进程,您将获得高达55ms的准确性。这很可能是您的代码发生的事情。这是一个快速示例,它允许您找出当前的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;

回答你的原始问题,你应该看到至少~700MBps的系统 - &gt;视频内存传输,即使在非常慢的旧PCIe v.1.0卡上也是如此。

相关问题