In questo codice sorgente, abbiamo anche 4 thred, la funzione kernel può accedere a tutti i 10 array. Come?
#define N 10 //(33*1024)
__global__ void add(int *c){
int tid = threadIdx.x + blockIdx.x * gridDim.x;
if(tid < N)
c[tid] = 1;
while(tid < N)
{
c[tid] = 1;
tid += blockDim.x * gridDim.x;
}
}
int main(void)
{
int c[N];
int *dev_c;
cudaMalloc((void**)&dev_c, N*sizeof(int));
for(int i=0; i<N; ++i)
{
c[i] = -1;
}
cudaMemcpy(dev_c, c, N*sizeof(int), cudaMemcpyHostToDevice);
add<<< 2, 2>>>(dev_c);
cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);
for(int i=0; i< N; ++i)
{
printf("c[%d] = %d \n" ,i, c[i]);
}
cudaFree(dev_c);
}
Perché non creare 10 thread ex) add<<<2,5>>> or add<5,2>>>
Perché dobbiamo creare ragionevolmente piccolo numero di thread, se N è maggiore di 10 ex) 33 * 1024.
Questo codice sorgente è un esempio di questo caso. Gli array sono 10, i thread cuda sono 4. Come accedere a tutti e 10 gli array solo per 4 thread.
vedere la pagina sul significato di threadIdx, blockIdx, blockDim, gridDim nel dettaglio cuda.
In questo codice sorgente,
gridDim.x : 2 this means number of block of x
gridDim.y : 1 this means number of block of y
blockDim.x : 2 this means number of thread of x in a block
blockDim.y : 1 this means number of thread of y in a block
nostro numero di filo sono 4, perché 2 * 2 (blocchi * filo).
In funzione del kernel aggiuntivo, si può accedere a 0, 1, 2, 3 indice di filo
->tid = threadIdx.x + blockIdx.x * blockDim.x
①0 + 0 * 2 = 0
②1 + 0 * 2 = 1
③0 + 1 * 2 = 2
④1 + 1 * 2 = 3
Come t o accesso resto punti 4, 5, 6, 7, 8, 9. C'è un calcolo nel ciclo while
tid += blockDim.x + gridDim.x in while
** prima chiamata di kernel **
-1 ciclo: 0+ 2 * 2 = 4
-2 ciclo: 4 + 2 * 2 = 8
-3 ciclo: 8 + 2 * 2 = 12 (ma questo valore è falso, mentre fuori!)
** seconda chiamata del kernel **
.515.053.691,36321 milioni
-1 ciclo: 1 + 2 * 2 = 5
-2 ciclo: 5 + 2 * 2 = 9
-3 ciclo: 9 + 2 * 2 = 13 (ma questo valore è falso , mentre esce)
** terzo richiamo del kernel **
-1 ciclo: 2 + 2 * 2 = 6
-2 ciclo: 6 + 2 * 2 = 10 (ma questo il valore è falso, mentre fuori!)
** quarto invito del kernel **
-1 ciclo: 3 + 2 * 2 = 7
-2 ciclo: 7 + 2 * 2 = 11 (! Ma questo valore è falso, mentre fuori)
Quindi, tutti gli indici di 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 possono accedere in base al valore tid.
fare riferimento a questa pagina. http://study.marearts.com/2015/03/to-process-all-arrays-by-reasonably.html Non riesco a caricare l'immagine, perché la reputazione bassa.
Direi che la tua risposta è la migliore, +1 – alrikai
@alrikai Stavo semplicemente aggiungendo alcuni commenti alla tua risposta quando l'hai cancellato (Poi in seguito hai ripubblicato, immagino). Prima eri tu, e la tua risposta va bene. –
Sì, l'avevo postato per sbaglio a metà circa della sua scrittura (whoops) – alrikai