OpenCL を使用すると、Radeon 7970 から i5 デスクトップのメイン メモリに 7MB/秒を超えるデータを取り込めないようです。
#include <iostream>
#include <Windows.h>
#include <CL/cl.h>
int main(int argc, char ** argv)
{
cl_platform_id platform;
clGetPlatformIDs(1, &platform, NULL);
cl_device_id device;
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);
cl_command_queue queue = clCreateCommandQueue(context, device, 0, NULL);
const char *source =
"__kernel void copytest(__global short* dst) {\n"
" __local short buff[1024];\n"
" for (int i = 0; i < 1024; i++) {\n"
" for (int j = 0; j < 1024; j++)\n"
" buff[j] = j;\n"
" (void)async_work_group_copy(&dst[i*1024], buff, 1024, 0);\n"
" }\n"
"}\n";
cl_program program = clCreateProgramWithSource(context, 1, &source, NULL, NULL);
clBuildProgram( program, 1, &device, NULL, NULL, NULL);
cl_kernel kernel = clCreateKernel( program, "copytest", NULL);
cl_mem buf = clCreateBuffer(context, CL_MEM_WRITE_ONLY, 1024 * 1024 * 2, NULL, NULL);
const size_t global_work_size = 1;
clSetKernelArg(kernel, 0, sizeof(buf), (void*)&buf);
LARGE_INTEGER pcFreq = {}, pcStart = {}, pcEnd = {};
QueryPerformanceFrequency(&pcFreq);
QueryPerformanceCounter(&pcStart);
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);
clFinish(queue);
QueryPerformanceCounter(&pcEnd);
std::cout << 2.0 * pcFreq.QuadPart / (pcEnd.QuadPart-pcStart.QuadPart) << "MB/sec";
}
ご覧のとおり、すべて単一の作業単位で動作しています。async_work_group_copy() を複数 (64) の作業単位に分散されたループに置き換えてみましたが、役に立ちませんでした。
Radeon から 7MB/秒よりも速くメモリを引き出す方法はありますか? 数百 MB/秒に興味があります。NVidiaの方が速いでしょうか?