【发布时间】:2020-07-24 20:13:24
【问题描述】:
我有以下用于矩阵乘法的代码,为简单起见而缩写。我计划使用block_size*block_size 的本地内存来保存一个子矩阵块。当我在 NVIDIA GPU 上运行它时,我在clEnqueueNDRangeKernel 中不断收到错误代码-52。经过一番研究,我发现 NVIDIA gpu 上的恒定内存大小非常小。
主持人:
cl::Buffer a_buf{ context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a.bytes(), a.data };
cl::Buffer b_buf{ context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a.bytes(), bT.data };
cl::Buffer result_buf{ context, CL_MEM_READ_WRITE , result.bytes(), nullptr }; //for memory mapping
kernel.setArg(0, a_buf);
kernel.setArg(1, b_buf);
kernel.setArg(2, local_size*local_size* sizeof(float), nullptr);
kernel.setArg(3, local_size*local_size* sizeof(float), nullptr);
kernel.setArg(4, result_buf);
queue.enqueueNDRangeKernel(kernel, { 0,0 }, { a.rows, a.rows }, {local_size, local_size});
// ^ offset ^global work size ^local work size
内核:
__kernel void matrixMul(__constant float* a,
__constant float* b, //storing the original matrix data
__local float* a_local,
__local float* b_local, //storing a sub-matrix block for the work-group
__global float* result)
{...}
使用CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,我的 RX580 会返回几乎所有可用的 VRAM,但我的 GTX1650 只返回 64KB。当使用__constant 而不是__global 时,我的RX580 确实获得了显着的性能提升。 是不是我做错了什么,或者我需要准备不同的内核才能在 AMD 和 NVIDIA gpus 上运行?
编辑:我在 github here 上发现了一个相关问题
所以我更改了__constant float* a -> __global const float* restrict a,它可以工作。
【问题讨论】:
标签: opencl