2011-06-26 135 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獲取緩衝區的最大大小。

你需要將你的問題分成更小的部分。分別計算它們,然後合併結果。

我不知道上面的問題,不能給你任何幫助你實現這一點的提示。我只能給你一個大方向。