2011-06-26 137 views
0

我已经从Bryan Catanzaro的great OpenCL SpMV article获取AMD的内核。 我给它一个玩具问题,其中输入是 A = [0 0 0 1 3 5 7 2 4 0 0] offset = [-3 0 2] x = [1 2 3 4] 和输出y应该是[7月22日15 34]OpenCL内核问题

这里是内核:

__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 = [7 22 15 34]

我是OpenCL(和GPGPU一般)的新手,所以我想尝试并理解如何正确地为任意维数的更大矩阵扩展问题。 因此,让我说我有1000 000行。我应该设置global_work_size为什么? 而且我应该设置local_work_size还是应该将它保留为NULL?

回答

0

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

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

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