Je veux lancer un programme cuda, mais je suis un débutant. Je dois écrire un programme pour un histogramme. Mais avec des seaux. En fonction de la valeur maxValue (40 dans l'exemple), le nombre sera ajouté au compartiment approprié. Si nous avons 4 seaux:Histogramme de programmation Cuda
histo: | 1 | 10 | 30 | 39 | 32 | 2 | 4 | 5 | 1 |
0-9 (1er seau)
10-19 (2e seau)
20-29 (3e seau)
30- 39 (4e seau)
Mon GPU a Capacité de calcul 1.1.
Je tentais de faire quelque chose comme ayant une température commune [] pour un bloc que chaque thread ajoute ses valeurs sur sa table temporaire:
__global__ void histo_kernel_optimized5(unsigned char *buffer, long size,
unsigned int *histo)
{
extern __shared__ unsigned int temp[];
temp[threadIdx.x] = 0;
__syncthreads();
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
int bucketID;
while (i < size)
{
bucketID = array[i]/Bwidth;
atomicAdd(&temp[bucketID], 1);
i += offset;
}
__syncthreads();
atomicAdd(&(histo[threadIdx.x]), temp[threadIdx.x]);
}
histo_kernel_optimized <<<array_size/buckets, buckets,buckets*sizeof(unsigned int)>>>(buffer,SIZE, histogram)
Mais le compilateur sais: Instruction « {atome , rouge} .shared 'nécessite. sm_12 cible ou plus
J'ai essayé aussi avoir une table temporaire pour chaque thread créé:
__global__ void histo_kernel_optimized5(unsigned char *buffer, long size,
unsigned int *histo)
{
unsigned int temp[buckets];
int j;
for (j=0;j<buckets;j++){
temp[j]=0;
}
int bucketID;
int i = threadIdx.x + blockIdx.x * blockDim.x;
int offset = blockDim.x * gridDim.x;
while (i < size)
{
bucketID = array[i]/Bwidth;
temp[bucketID]++;
i += offset;
}
for (j=0;j<buckets;j++){
histo[j] += temp[j];
}
}
Mais compilateur ne me laisse pas le faire car il a besoin d'une constante pour créer la température table. Mais le problème dit que seaux sont dynamiquement donné pour la ligne de commande.
Existe-t-il une autre façon de le faire? Je ne sais pas comment le faire. Je suis confus.
Pourquoi vous ajoutez une taille de bloc à la taille: grid ((size + block.x - 1) /block.x); –
Alors que le nombre total de threads est ** atleast ** égal à la «taille».Cette formule arrondit le nombre total de threads à plusieurs blocs de taille supérieure ou égale à 'size'. Choisissez une valeur de 'size' et calculez le nombre total de threads à voir par vous-même. – sgarizvi
oui, vous avez raison! Mais je n'obtiens pas les mêmes résultats, l'histogramme parallèle [] et l'histogramme [] sont différents! Je ne sais pas pourquoi, j'ai utilisé votre code tel qu'il est! –