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?