2011-06-26 9 views
0

私は、Bryan CatanzaroがAMDのgreat OpenCL SpMV articleからカーネルを入手しました。私はそれを入力 A = [0 0 6 1 3 5 7 2 4 0 0] オフセット= -3 0 2] X = [1 2 3 4] となる玩具の問題を与えている ローディング後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); 

およびIを取得し、出力yはここ

がカーネルである[7 22 15 34]であるべきです私が再会したときの正しい結果gpuのメモリからad yを返します。 I.私は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を使用して、バッファの最大サイズを取得できます。

問題をより細かく分割する必要があります。それらを別々に計算し、後で結果をマージします。

私は上記の問題を知らず、これを実装するのに役立つヒントを与えることはできません。私はあなたに一般的な方向を与えることができます。