Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL内核问题_Opencl - Fatal编程技术网

OpenCL内核问题

OpenCL内核问题,opencl,Opencl,我从Bryan Catanzaro为AMD设计的内核。 我给它一个玩具问题,输入是 A=[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, __

我从Bryan Catanzaro为AMD设计的内核。 我给它一个玩具问题,输入是 A=[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;
}
当我从gpu内存中读取y时,我得到了正确的结果。 也就是说,我得到y=[7221534]

我是OpenCL和GPGPU的新手,所以我想尝试并理解如何将问题正确地扩展到更大的任意维矩阵。 假设我有10万行。我应该将全局工作大小设置为什么?
我应该设置本地工作大小还是将其保留为空?

要将内核用于任意矩阵大小,您应该考虑这个问题并重写内核。问题是GPU的内存大小有限,单个缓冲区的大小有限。您可以使用clGetDeviceInfo和CL_DEVICE_MAX_MEM_ALLOC_size获取缓冲区的最大大小

你需要把你的问题分成更小的部分。分别计算它们,然后合并结果

我不知道上面的问题,也不能给你任何帮助你实现这一点的提示。我只能给你大致的方向

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);