我已经从Bryan Catanzaro的AMD great OpenCL SpMV article获取了内核。 我已经给出了输入的玩具问题 A = [0 0 0 6 1 3 5 7 2 4 0 0] 偏移= [-3 0 2] x = [1 2 3 4] 输出y应为[7 22 15 34]
这是内核:
__kernel
void dia_spmv(__global float *A, __const int rows,
__const int diags, __global int *offsets,
__global float *x, __global float *y) {
int row = get_global_id(0);
float accumulator = 0;
for(int diag = 0; diag < diags; diag++) {
int col = row + offsets[diag];
if ((col >= 0) && (col < rows)) {
float m = A[diag*rows + row];
float v = x[col];
accumulator += m * v;
}
}
y[row] = accumulator;
}
在加载和写入输入参数后,我执行内核,如下所示:
size_t global_work_size;
global_work_size = 4;
err = clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size,NULL, 0, NULL, NULL);
err = clFinish(cmd_queue);
当我从gpu内存中读回y时,我得到了正确的结果。 即我得到y = [7 22 15 34]
我是OpenCL(以及GPGPU)的新手,所以我想尝试理解如何针对任意维度的更大矩阵正确扩展问题。 所以假设我有1000 000行。我应该将global_work_size设置为什么? 我应该设置local_work_size还是应该将其保留为NULL?
答案 0 :(得分:0)
要将内核用于任意矩阵大小,您应该考虑问题并重写内核。问题在于GPU的内存大小有限以及单个缓冲区的大小有限。您可以使用clGetDeviceInfo和CL_DEVICE_MAX_MEM_ALLOC_SIZE获取缓冲区的最大大小。
您需要将问题分成更小的部分。单独计算它们并在之后合并结果。
我不知道上面的问题,也不能给你任何帮助你实现这个的提示。我只能给你一般指示。