0

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";
4

1 回答 1

1

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

首先,您的样本没有推动 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 卡上也是如此。

于 2013-08-16T00:19:24.427 回答