【问题标题】:How long does it take to transfer data between the main memory and GPU memory?在主存和 GPU 内存之间传输数据需要多长时间?
【发布时间】:2013-08-15 19:10:57
【问题描述】:

GPU 对我来说是新的。这个 OpenCL sn-p 说它在 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";

【问题讨论】:

  • 哇!我觉得听起来很快。这是一台较旧的工作计算机,所以也许这就是它听起来很慢的原因。
  • 其实,opencl运行时不处理是否使用主存吗?所以在这种情况下,它可能永远不会真正转移到 gpu 内存?
  • PCI-e 3.0 带宽超过 5GB/s 所以超过 5MB/ms 所以超过 35MB/7ms 但是你的已经老了所以 pci-e 2.0 几乎一半所以 17MB/7ms 你说它的 7mb/7ms 所以它可能更旧的 pci-e 1.0 所以你可能是对的。如果您的卡支持 cl/gl 互操作,那么您可以在卡中进行计算,因此不会复制。

标签: opencl gpu gpgpu


【解决方案1】:

1MBps 对于任何可以运行 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;

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

【讨论】:

    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2016-06-26
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    相关资源
    最近更新 更多