Sto usando Cuda SDK 4.0 e sto riscontrando un problema che mi ha richiesto 2 giorni per crearmi nel seguente codice.cudaFreeHost cura quale dispositivo è attivo quando cudaMallocHost viene utilizzato per allocare memoria?
#include <cuda.h>
#include <cuda_runtime.h>
void main (int argc, char ** argv) {
int* test;
cudaError_t err;
err = cudaSetDevice( 1 ); err = cudaMallocHost(&test, 1024*sizeof(int));
err = cudaSetDevice( 0 ); err = cudaFreeHost(test);
}
Questo genera il seguente errore nel richiamo cudaFreeHost:
First-chance exception at 0x000007fefd96aa7d in Test.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0022f958..
Il valore ERR è cudaErrorInvalidValue
Lo stesso errore si verifica tale variazione:
err = cudaSetDevice( 0 ); err = cudaMallocHost(&test, 1024*sizeof(int));
err = cudaSetDevice( 1 ); err = cudaFreeHost(test);
Le seguenti variazioni non lanciare l'errore:
err = cudaSetDevice( 0 ); err = cudaMallocHost(&test, 1024*sizeof(int));
err = cudaSetDevice( 0 ); err = cudaFreeHost(test);
e
err = cudaSetDevice( 1 ); err = cudaMallocHost(&test, 1024*sizeof(int));
err = cudaSetDevice( 1 ); err = cudaFreeHost(test);
Ho avuto l'impressione che solo bisogno di chiamare cudaSetDevice se si vuole allocare memoria su una GPU specifica. Nell'esempio sopra, sto solo assegnando la memoria bloccata alla CPU.
Si tratta di un errore o ho perso qualcosa nel manuale?
A meno che UVA è a tutti gli effetti sul sistema [UVA calci in modo trasparente su CUDA 4.0, il 64- bit Linux. È anche disponibile in modo limitato su Windows, se si utilizzano i driver TCC], cudaMallocHost() mappa solo la memoria dell'host per il dispositivo corrente e solo quel dispositivo può liberare la memoria. Rendere "portatile" l'allocazione della memoria host mappa la memoria di tutti i dispositivi e ogni dispositivo può liberarla. Questo è il motivo per cui la tua soluzione ha funzionato. – ArchaeaSoftware