First : I'm sorry if this topic is not well done (it's my first topic) I'm currently trying to learn the GPU compute on NVIDIA but I've a problem with the __syncthreads() method from CUDA, i think it's doesn't work. I've try to shearch on web and I've not found a fix.
__global__ void stencil_1d(int *in, int *out) {
__shared__ int temp[BLOCK_SIZE + 2 * RADIUS]; // Création de la mémoire partagée avec tout les threads d'un même block
int gindex = threadIdx.x + blockIdx.x * blockDim.x;
int lindex = threadIdx.x + RADIUS;
/*for (int i = 0; i < N*sizeof(int); i++)
printf("%i ---i=%i \n", in[i], i);*/
// Déplacer les éléments d'entrées sur la mémoire partagée
temp[lindex] = in[gindex];
if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
}
__syncthreads(); // Synchronisation des Threads d'un même Block
int result = 0;
for (int offset = -RADIUS; offset <= RADIUS ; offset++)
result += temp[lindex + offset];
out[gindex] = result;
}
When I uncomment the for
the program work properly, but currently without the for
my pogramm return -842150451 in the out
variable.
The main code :
int main()
{
int size = N * sizeof(int);
/******************** Utilisation de la fonction GPU stencil_1d ********************/
int *in, *out; // Variable sur la mémoire Host
int *d_in, *d_out; //Variable sur la mémoire Device
// Allocation de la mémore aux variables sur le Device
cudaMalloc((void**)&d_in, size);
cudaMalloc((void**)&d_out, size);
// Allocation de la mémoire aux variables de Host
in = (int*)malloc(size); random_ints(in, N);
out = (int*)malloc(size);
// Copie des valeurs des variables de Host vers Device
cudaMemcpy(d_in, in, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_out, out, size, cudaMemcpyHostToDevice);
// Exécution de la fonction sur le Device (ici 3 Blocks, 10 Threads)
stencil_1d <<<N/THREADS_PER_BLOCK, THREADS_PER_BLOCK>>>(d_in, d_out);
// Récupération de la variable out de Device vers Host
cudaMemcpy(out, d_out, size, cudaMemcpyDeviceToHost);
// Affichage du résultat
for(int i=0; i<size; i++)
printf("%i ---i=%i \n", out[i], i);
// Libération de la mémoire prise par les variables sur Host
free(in); free(out);
// Libération de la mémoire prise par les variables sur le Device
cudaFree(d_in); cudaFree(d_out);
return 0;
}
If forgot that : The define :
#define N 30
#define THREADS_PER_BLOCK 10
#define BLOCK_SIZE (N/THREADS_PER_BLOCK)
#define RADIUS 3
The random_ints code:
void random_ints(int *var, int n) // Attribue une valeur à toutes le composantes des variables
{
int i;
for (i = 0; i < n; i++)
var[i] = 1;
}
Thanks by advance for your answers.