Implémentation d'une section critique dans CUDA

Je suis en train de mettre en œuvre un section critique dans CUDA à l'aide atomique instructions, mais j'ai rencontré quelques difficultés. J'ai créé le programme de test pour montrer le problème:

#include <cuda_runtime.h>
#include <cutil_inline.h>
#include <stdio.h>

__global__ void k_testLocking(unsigned int* locks, int n) {
    int id = threadIdx.x % n;
    while (atomicExch(&(locks[id]), 1u) != 0u) {} //lock
    //critical section would go here
    atomicExch(&(locks[id]),0u); //unlock
}

int main(int argc, char** argv) {
    //initialize the locks array on the GPU to (0...0)
    unsigned int* locks;
    unsigned int zeros[10]; for (int i = 0; i < 10; i++) {zeros[i] = 0u;}
    cutilSafeCall(cudaMalloc((void**)&locks, sizeof(unsigned int)*10));
    cutilSafeCall(cudaMemcpy(locks, zeros, sizeof(unsigned int)*10, cudaMemcpyHostToDevice));

    //Run the kernel:
    k_testLocking<<<dim3(1), dim3(256)>>>(locks, 10);

    //Check the error messages:
    cudaError_t error = cudaGetLastError();
    cutilSafeCall(cudaFree(locks));
    if (cudaSuccess != error) {
        printf("error 1: CUDA ERROR (%d) {%s}\n", error, cudaGetErrorString(error));
        exit(-1);
    }
    return 0;
}

Ce code, malheureusement, dur de se fige ma machine pendant plusieurs secondes et enfin les sorties, l'impression du message:

fcudaSafeCall() Runtime API error in file <XXX.cu>, line XXX : the launch timed out and was terminated.

ce qui signifie que l'une de ces boucles while n'est pas de retour, mais il semble que cela devrait fonctionner.

Comme un rappel atomicExch(unsigned int* address, unsigned int val) atomiquement définit la valeur de l'emplacement de la mémoire stockée dans val et renvoie le old valeur. Donc, l'idée derrière mon mécanisme de verrouillage est qu'il est d'abord 0usi un thread doit obtenir au-delà de la while boucle et tous les autres threads doivent attendre sur le while boucle, car ils vont lire locks[id] comme 1u. Puis, quand le thread est fait avec le section critiqueil réinitialise la serrure à 0u alors qu'un autre thread puisse entrer.

Ce qui me manque?

Par ailleurs, je suis de la compilation avec:

nvcc -arch sm_11 -Ipath/to/cuda/C/common/inc XXX.cu

source d'informationauteur John | 2010-01-07