gpt4 book ai didi

c++ - 对于简单的矩阵乘法,OpenCL CPU 比 OpenCL GPU 更快

转载 作者:行者123 更新时间:2023-11-30 03:49:26 27 4
gpt4 key购买 nike

<分区>

我创建了一个简单的 OpenCL 程序,它使用朴素矩阵乘法(复杂度为 O(n^3) 的矩阵)将两个 NxN 矩阵相乘。每个矩阵的每个值都是一个单精度 32 位 float 。该程序是在 Windows 10 x64 上使用 visual studio 2015 编译的。

N=2048,使用intel OpenCL平台,耗时如下:

  • 结果 CPU(酷睿 i7 3517U):16 秒
  • 结果 GPU(Intel HD 4000):43 秒

编辑:澄清一下,上面的 CPU 结果是使用英特尔的 OpenCL CPU 实现执行的。在常规的 C++ 串行 CPU 实现中,它花费了 82 秒。

在相同硬件上使用 Nvidia OpenCL 平台,结果没有太大区别:

  • 结果 GPU (GeForce 720M):32 秒

这是调用 OpenCL 的 C++ 代码:

//create kernel
cl_kernel krnl = clCreateKernel(program, "matmult", NULL);
//create buffer (for source matrices, read only)
cl_mem srcBuff = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*size*size, src, NULL);
cl_mem dstBuff = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*size*size, dst, NULL);
//buffer for result
float* res = (float*)malloc(sizeof(float)*size*size);
cl_mem resBuff = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float)*size*size, NULL, NULL);
//set kernel args
clSetKernelArg(krnl, 0, sizeof(cl_mem), &srcBuff);
clSetKernelArg(krnl, 1, sizeof(cl_mem), &dstBuff);
clSetKernelArg(krnl, 2, sizeof(cl_mem), &resBuff);
clSetKernelArg(krnl, 3, sizeof(int), &size);
//run
size_t dimSizes[] = { size,size };
clEnqueueNDRangeKernel(commandQueue, krnl, 2, NULL, dimSizes, NULL, NULL, NULL, NULL);
clEnqueueReadBuffer(commandQueue, resBuff, CL_TRUE, 0, sizeof(float)*size*size, res, 0, NULL, NULL);
return res;

这是 OpenCL 内核函数:

__kernel void matmult(__global const float* src, __global const float* dst, 
__global float* ret, const int n) {
int y=get_global_id(0);
int x=get_global_id(1);
float sum=0;
for(int i=0;i<n;i++){
sum+=src[y*n+i] * dst[i*n+x];
}
ret[y*n+x]=sum;
}

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com