2012-07-02 21 views
7

Soy principiante en programación paralela. Tengo una consulta que podría parecer tonta, pero no obtuve una respuesta definitiva cuando la busqué en Google.GPU lee desde CPU o CPU escribe en la GPU?

En la computación GPU hay un dispositivo, es decir, la GPU y el host, es decir, la CPU. Escribí un programa hello world simple que asignará algo de memoria en el gpu, pasará dos parámetros (digamos src [] y dest []) al kernel, copiará src string, es decir, Hello world to dest cadena y obtendrá la cadena dest de gpu para el anfitrión.

¿La cadena de caracteres "src" es leída por la GPU o la CPU escribe en la GPU? Además, cuando recuperamos la cadena de la GPU, ¿la GPU está escribiendo en la CPU o leyendo la CPU desde la GPU?

En la transferencia de los datos de ida y vuelta no puede haber cuatro posibilidades 1. CPU a la GPU - CPU escribe a GPU - GPU lee forma CPU 2. GPU para CPU - GPU escribe a la CPU - CPU lee de GPU

¿Puede alguien explicar cuáles de estos son posibles y cuáles no?

Respuesta

7

En versiones anteriores de CUDA y los correspondientes modelos de hardware, la GPU era más estrictamente un coprocesador propiedad de la CPU; la CPU escribió información en la GPU y leyó la información cuando la GPU estaba lista. En el nivel inferior, esto significaba que realmente las cuatro cosas estaban sucediendo: la CPU escribía datos en PCIe, la GPU leía datos de PCIe, la GPU escribía datos en PCIe y la CPU volvía a leer el resultado. Pero las transacciones fueron iniciadas por la CPU.

Más recientemente (CUDA 3? 4? Tal vez incluso comenzando en 2?), Algunos de estos detalles están ocultos desde el nivel de la aplicación, de modo que, efectivamente, el código GPU puede iniciar transferencias de la misma manera que la CPU puede. Considere el direccionamiento virtual unificado, mediante el cual los programadores pueden acceder a un espacio de dirección virtual unificado para la CPU y la memoria de la GPU. Cuando la GPU solicita memoria en el espacio de la CPU, esto debe iniciar una transferencia desde la CPU, esencialmente leyendo desde la CPU. La capacidad de poner datos en la GPU desde el lado de la CPU también se conserva. Básicamente, todas las formas son posibles ahora, en el nivel superior (en niveles bajos, es en gran medida el mismo tipo de protocolo que siempre: ambos leen y escriben en el bus PCIe, pero ahora, las GPU también pueden iniciar transacciones).

+1

Que, a través de varios controladores sincronizados se reduce a DMA (http://en.wikipedia.org/wiki/Direct_memory_access). – Ani

+0

Muchas gracias. Es bueno saber que la GPU también puede iniciar las transacciones. Entonces, ¿hay alguna manera de saber quién inició realmente las transacciones usando cualquiera de las rutinas de la biblioteca en Opencl? o las rutinas con las que puedo obligar a la CPU o a la GPU a realizar la transacción ...? – Nike

+0

No conozco OpenCL tan bien como debería; Dicho esto, me sorprendería si CUDA no le proporcionara * alguna * forma de verificar dónde vivía una variable en el espacio de direcciones virtuales unificadas. Ese tipo de información podría ser útil, incluso fuera del caso de uso de las transferencias administradas explícitamente (que las versiones más nuevas aún deberían admitir). – Patrick87

1

En OpenCL, el Host (CPU) controla exclusivamente todas las transferencias de datos entre la GPU y la GPU. El host transfiere datos a la GPU utilizando búferes. El host transfiere (lee) desde la GPU usando búferes. Para algunos sistemas y dispositivos, la transferencia no copia físicamente los bytes ya que el Host y la GPU usan la misma memoria física. Esto se llama copia cero.

2

Actualmente ninguno de estos. El código de su CPU inicia la copia de datos, pero mientras los datos son transferidos por el controlador de memoria a la memoria de la GPU a través de cualquier bus que tenga en su sistema. Mientras tanto, la CPU puede procesar otros datos. De manera similar, cuando la GPU ha terminado de ejecutar los núcleos que inició, su código de CPU inicia la copia de datos, pero mientras tanto la GPU y la CPU pueden manejar otros datos o ejecutar otro código.

Las copias se llaman asíncronas o no bloqueantes. Opcionalmente puede hacer copias de bloqueo, en las que la CPU espera a que se complete la copia.

Al iniciar tareas asíncronas, generalmente registra un "evento", que es un tipo de indicador que puede verificar más adelante, para ver si la tarea está finalizada o no.

1

Acabo de enterarme en este foro http://devgurus.amd.com/thread/129897 que utiliza CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR en clCreateBuffer asigna memoria en el host y no se copiará en el dispositivo.

Puede haber problemas con el rendimiento, pero esto es lo que estoy buscando. Sus comentarios por favor ..