2011-06-26 3 views
0

J'ai pris le noyau de la great OpenCL SpMV article pour AMD par Bryan Catanzaro. Je lui ai donné un problème de jouet où l'entrée est A = [0 0 0 6 1 3 5 7 2 4 0 0] offsets = [-3 0 2] x = [1 2 3 4] et le sortie y devrait être [7 22 15 34]OpenCL noyau question

Voici le noyau:

__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; 
} 

Après le chargement et l'écriture des arguments d'entrée j'exécute le noyau comme ceci:

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

et je reçois le résultat correct quand je suis retour de la mémoire du GPU. I.e. Je reçois y = [7 22 15 34]

Je suis nouveau à OpenCL (et GPGPU en général) donc je veux essayer et comprendre comment étendre le problème correctement pour des matrices beaucoup plus grandes de dimension arbitraire. Disons que j'ai 1000 000 lignes. Que devrais-je définir global_work_size? Et devrais-je définir local_work_size ou devrais-je le laisser comme NULL?

Répondre

0

Pour utiliser le noyau pour des tailles de matrice arbitraires, vous devez penser au problème et réécrire le noyau. Le problème est la taille de la mémoire limitée du GPU et la taille limitée pour un seul tampon. Vous pouvez obtenir la taille maximale pour un tampon avec clGetDeviceInfo et CL_DEVICE_MAX_MEM_ALLOC_SIZE.

Vous devez diviser votre problème en plus petits morceaux. Calculez-les séparément et fusionnez les résultats par la suite.

Je ne connais pas le problème ci-dessus et je ne peux pas vous donner d'indice qui vous aide à l'implémenter. Je peux seulement vous donner la direction générale.