2012-06-20 4 views
5

Sono nuovo nell'usare Thrust e c'è una cosa che non capisco. La spinta è asincrona o sincrona?Thrust è sincrono o asincrono?

Se scrivo il seguente codice, il tempo impiegato non è 0. Ma negli altri tag, altri utenti segnalano un risultato di 0. Qual'è la verità?

clock_t start,end; 

start=clock(); 
thrust::sort_by_key(vettore.begin(), vettore.end(), counter.begin()); 

end=clock(); 

double time=((double)(end-start))/CLOCKS_PER_SEC; 

cout<<"execution time"<<time<<endl;// the result is 0.327 
+0

Nota: domanda correlata nel forum NVIDIA [qui] (https://devtalk.nvidia.com/default/topic/864759/is-thrust-copy-synchrous-or-asynchronus-/). – BenC

risposta

2

Kernel lanci sono sempre stati asincrono - anche in CUDA 1.0 - in modo che qualsiasi chiamata di spinta che si traduce solo in un lancio kernel sarà asincrona.

Qualsiasi codice Thrust che attiva implicitamente memcpy sarà sincrono a causa della mancanza di supporto del flusso, come accennato da marina.k.

+3

Ad esempio, thrust :: reduce() è sicuramente sincrono poiché legge il risultato e lo restituisce al thread chiamante tramite il valore restituito. Faccio alcuni commenti su queste limitazioni nel mio recente post sul blog su Thrust: http://developer.nvidia.com/content/expressive-algorithmic-programming-thrust – harrism

0

La granularità della funzione clock() non è buona come si pensa in Windows. E in Windows XP la sua granularità è pari a 16 msec.

Invece di utilizzare clock(), utilizzare un timer ad alta risoluzione o le funzioni di temporizzazione della libreria Cutil (che in genere è preferibile).

Discussione sul timer ad alta risoluzione in Windows: C++ high precision time measurement in Windows

discussione sull'uso di CUtil libreria per tempistica: CUDA: CUtil timer - confusion on elapsed time

0

è possibile farlo aggiungere manualmente il time.h al indicizzatore, andare in Preferenze - > C/C++ -> indicizzatore e lo mise davanti alla esistente "file da indicizzare up-front" come questo:

time.h, cstdarg, stdarg.h, ..... 

è andare a lavorare