He estado buscando formas de reducir la latencia causada por la transferencia de datos de ida y vuelta de la CPU y la GPU. Cuando empecé a usar CUDA me di cuenta de que la transferencia de datos entre la CPU y la GPU hizo tomar un par de segundos, pero realmente no importa porque esta no es realmente una preocupación para los pequeños programas que voy a escribir. De hecho, la latencia probablemente no es mucho de un problema para la gran mayoría de los programas que utilizan la Gpu, juegos de video incluido, porque son todavía mucho más rápido que si se hubiera ejecutarse en la CPU.

Sin embargo, estoy un poco de HPC entusiasta y me convertí en cuestión con la dirección de mis estudios cuando vi la enorme discrepancia entre el Tianhe-me pico teórica FLOPS y el real LINPACK medir el rendimiento. Esto ha planteado mis dudas acerca de si estoy tomando la carrera adecuada.

Uso de anclado de memoria (página bloqueada) memoria a través del uso de la cudaHostAlloc función() es un método de reducir la latencia (muy eficaz), pero hay otras técnicas que no soy consciente de que? Y para ser claro, yo estoy hablando acerca de cómo optimizar el código, no el hardware en sí (que es de NVIDIA y AMD, los puestos de trabajo).

Sólo como una pregunta, estoy consciente de que Dell y HP vender Tesla servidores. Soy curioso en cuanto a cómo una GPU aprovecha una aplicación de base de datos, donde se necesita una constante lectura de la unidad de disco duro (HDD o SSD), una operación que sólo la CPU puede realizar,

  • Usted puede encontrar este divertido: cs.virginia.edu/~skadron/Papers/bakkum_sqlite_gpgpu10.pdf
  • Tienes razón, en este artículo se describe el particular, el reto que tenía en mente. Gracias…
  • Respecto a las bajas flop-eficiencia de la Tianhe-IA: a pesar de que las GPUs tienen un enorme aritmética de energía (lo que ideed es a menudo difícil de utilizar plenamente), no hay que olvidar que la GPU de la arquitectura de la memoria también juega un papel importante e incluso limitados por cpu núcleos serio puede superar a la CPU de las implementaciones.
InformationsquelleAutor sj755 | 2011-06-28

3 Comentarios

  1. 14

    Hay un par de maneras de direcciones de la CPU-GPU de la sobrecarga de la comunicación – espero que lo que quieres decir por la latencia y no la latencia de la transferencia en sí. Tenga en cuenta que he utilizado deliberadamente el término dirección en lugar de reducir como usted no necesariamente necesita para reducir la latencia si se puede ocultar. También tenga en cuenta que yo estoy mucho más familiarizado con CUDA, por lo que a continuación sólo se refieren a CUDA, pero algunas funciones también están disponibles en OpenCL.

    Como usted ha mencionado página bloqueada memoria tiene el propósito de aumentar. Además, uno puede asignar bloqueada página de acogida de la memoria de la GPU, mecanismo que permite el acceso directo de los datos asignados por el núcleo de la GPU sin necesidad de otro tipo de transferencia de datos. Este mecanismo es llamado cero-copia de transferencia y es útil si los datos se leen/escriben sólo una vez acompañados por una cantidad sustancial de la computación y de las Gpu sin memoria independiente (móvil). Sin embargo, si el núcleo de acceso al cero-copiado de datos no es fuertemente limitados por cpu y por lo tanto la latencia de acceso a los datos no se puede ocultar, página bloqueada, pero no de la memoria asignada será más eficiente. Además, si los datos no caben en la memoria de la GPU, cero-copia todavía trabajo.

    Tenga en cuenta que la excesiva cantidad de páginas de memoria bloqueada puede causar grave desaceleración en el lado de la CPU.

    Acercarse al problema desde un ángulo diferente, como tkerwin mencionado, de transferencia asíncrono (respecto de la CPU hilo hablando de la GPU) es la clave para ocultar CPU-GPU de transferencia de latencia mediante la superposición de cálculo de la CPU con la transferencia. Esto puede lograrse con cudaMemcpyAsync() así como el uso de cero-copia con asincrónica núcleo de ejecución.

    Uno puede tomar aún más mediante el uso de múltiples flujos de superposición de transferencia con el núcleo de ejecución. Observe que la secuencia de programación puede ser que necesite una atención especial para la buena superposición; Tesla y Quadro tarjetas de doble motor DMA que permite simultánea de transferencia de datos a y desde la GPU.
    Además, con CUDA 4.0 se hizo más fácil el uso de una GPU de múltiples hilos de CPU, por lo que en un multi-threaded CPU código de cada hilo puede enviar sus datos a la GPU y el lanzamiento de los núcleos más fácil.

    Finalmente, GMAC implementa una relación asimétrica de memoria compartida modelo para CUDA. Una de sus características más interesantes es la coherencia de los modelos que ofrece, en particular, perezoso y actualización sucesiva permitiendo la transferencia de sólo los datos modificados en la CPU en un bloqueo de la moda.

    Para más detalles consulte el siguiente documento: Gelado et al. – Una Relación Asimétrica De Memoria Compartida Distribuida
    Modelo para Heterogéneos Sistemas Paralelos
    .

  2. 3

    Puede utilizar cudaMemcpyAsync() para solapar el trabajo que está realizando en la CPU con la memoria de transferencia. Esto no menor sea la latencia de una transferencia de datos, pero se podría mejorar el rendimiento general de un algoritmo. Hay algo de información sobre ella en la CUDA C de las Mejores Prácticas guía.

  3. 0

    Si la latencia es un problema, que podría ser digno de mirar en las compensaciones que usted puede hacer con el AMD fusion arquitectura. La latencia que se obtiene es drásticamente reducida posible y en algunos casos puede ser más rápido que la CPU transfiere desde la memoria RAM. Sin embargo, hay que tomar un impacto en el rendimiento con el uso de la adelgazado no-GPU discreta.

Dejar respuesta

Please enter your comment!
Please enter your name here