Domanda

Sto avendo qualche problema con un programma CUDA molto di base. Ho un programma che moltiplica due vettori sull'host e sul dispositivo e poi li confronta. Questo funziona senza un problema. Che cosa c'è che non va è che sto cercando di testare diverso numero di fili e blocchi a fini di apprendimento. Ho il seguente kernel:

__global__ void multiplyVectorsCUDA(float *a,float *b, float *c, int N){
    int idx = threadIdx.x;
    if (idx<N) 
        c[idx] = a[idx]*b[idx];
}

che io chiamo come:

multiplyVectorsCUDA <<<nBlocks, nThreads>>> (vector_a_d,vector_b_d,vector_c_d,N);

Per il momento ho fissato nBLocks 1 in modo che variano solo le dimensioni N vettore e il numero di fili nThreads. Da quanto ho capito, ci sarà un thread per ogni moltiplicazione così N e nThreads devono essere uguali.

Il problema è il seguente

  1. I primi chiamare il kernel con N=16 e nThreads<16 che non funziona. (Questo è ok)
  2. Poi mi chiamano con N=16 e nThreads=16 che funziona bene. (Ancora funziona come previsto)
  3. Ma quando io lo chiamo con N=16 e nThreads<16 funziona ancora!

Non capisco il motivo per cui l'ultimo passaggio non manca, come il primo. Fallisce di nuovo solo se si riavvia il PC.

Qualcuno ha imbattersi in qualcosa di simile prima o può spiegare questo comportamento?

È stato utile?

Soluzione 2

Non so se il suo ok per rispondere alla mia domanda, ma mi sono reso conto che avevo un bug nel mio codice quando si confrontano i vettori di host e dispositivi (quella parte del codice non è stato pubblicato). Ci dispiace per l'inconvenienza. Qualcuno potrebbe chiudere questo post dal momento che non mi permette di eliminarlo?

Altri suggerimenti

Attendere, quindi stai chiamando tutti e tre di fila? Non so il resto del codice, ma sei sicuro che si Non Sei sgombero della memoria grafica si alloced tra ogni corsa? Se no, che potrebbe spiegare il motivo per cui non funziona la prima volta ma non la terza volta in cui si sta passando gli stessi valori, e perché funziona solo dopo il riavvio (cancella il riavvio tutta la memoria alloced).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top