2012-09-17 7 views
5

Tengo preguntas sobre cómo hacer memoria fija.Cómo hacer que el valor de tipo vector a la memoria anclado en cuda

Ahora estoy usando CUDA para tratar con un gran tamaño de datos.

Para reducir el tiempo de ejecución, creo que es necesario hacer que la copia de memoria y el inicio del kernel se superpongan.

Después de buscar algunos textos y páginas web, para superponer copia de memoria y kernel-launch, noto que es necesario asignar memoria de host utilizando cudaMallocHost que asignará la memoria de host a la memoria anclada.
En el caso de usar un entero o un tipo de matriz en el host, era fácil hacer memoria fija.

Al igual que este ...

cudaStream_t* streams = (cudaStream_t*)malloc(MAX_num_stream * sizeof(cudaStream_t)); 
for(i=0; i<MAX_num_stream; i++) 
    cudaStreamCreate(&(streams[i])); 

cudaMallocHost(&departure, its_size); 

for(n=1; ... ; n++){ 
    cudaMemcpyAsync(... streams[n]); 
    kernel <<< ... , ... , ... , streams[n] >>> (...); 
} 

Pero en mi caso, mi memoria de salida host está configurado por tipo vertor.

Y no puedo encontrar en ninguna parte la forma de convertir vector-type-host-memory en memoria fija utilizando cudaMallocHost.

Ayúdame o déme algunos consejos para resolver este problema. Gracias por leer mi pobre inglés. Gracias.

+1

¿Qué quiere decir exactamente con "vector type"? ¿Te refieres a C++ 'std :: vector', o algo más? – talonmies

+0

Sí. Quiero decir std :: vector. – Umbrella

Respuesta

4

Directamente, no puede asignar memoria para ningún otro tipo de POD usando cudaMallocHost.

Si realmente necesita un std::vector que utiliza la memoria clavado, que tendrá que implementar su propio modelo de std::allocator que exige cudaMallocHost interna como una instancia de su std::vector usando ese asignador personalizado.

Alternativamente, el thrust template library (que se distribuye en versiones recientes de CUDA Toolkit) incluye un asignador de memoria experimental cubrió a la que se puede utilizar con empujes propia clase vector, que iteself es un modelo de std::vector.

+0

Gracias talonmies. Este contenido fue útil para mi caso. – Umbrella

+0

Y tengo una pequeña pregunta más. ¿Está bien usar cudaMemcpyAsync y kernel sin cudaMallocHost? Intentaba crear un código asíncrono sin crear una memoria anclada en el host, pero funcionó bien. ¿Es general o accidental? – Umbrella

+1

Sí, funcionará, pero las transferencias no serán asincrónicas en el dispositivo para ninguna transferencia> 64kb. La llamada a la API de host vuelve inmediatamente, pero el dispositivo está bloqueado hasta que la copia se complete, es decir. no hay ejecución simultánea del kernel y copia de memoria ni ningún otro beneficio de 'cudaMemcpyAsync'. – talonmies

Cuestiones relacionadas