2012-01-14 8 views
7

Cada dispositivo GPU (AMD, NVidea o cualquier otro) se divide en varias Unidades de cálculo (MultiProcessors), cada una de las cuales tiene un número fijo de núcleos (VertexShaders/StreamProcessors). Entonces, uno tiene (Compute Units) x (VertexShaders/compute unit) procesadores simultáneos para calcular, pero solo hay una pequeña cantidad fija de memoria __local (generalmente 16KB o 32KB) disponible por MultiProcessor. Por lo tanto, importa el número exacto de estos multiprocesadores.Tamaño de memoria local OpenCL y número de unidades de cálculo

Ahora mis preguntas:

  • (a) ¿Cómo puedo saber el número de multiprocesadores en un dispositivo? ¿Es esto lo mismo que CL_DEVICE_MAX_COMPUTE_UNITS? ¿Puedo deducirlo de hojas de especificaciones como http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?
  • (b) ¿Cómo puedo saber la cantidad de memoria __local por MP que hay disponible en una GPU antes de comprarla? Por supuesto, puedo solicitar CL_DEVICE_LOCAL_MEM_SIZE en una computadora que lo ejecute, pero no veo cómo puedo deducirlo ni siquiera de una hoja de especificaciones detalladas como, por ejemplo, http://www.amd.com/us/products/desktop/graphics/7000/7970/Pages/radeon-7970.aspx#3.
  • (c) ¿Cuál es la tarjeta con actualmente la mayor CL_DEVICE_LOCAL_MEM_SIZE? El precio realmente no importa, pero 64KB (o más) daría un beneficio claro para la aplicación que estoy escribiendo, ya que mi algoritmo es completamente paralelizable, pero también requiere mucha memoria con un patrón de acceso aleatorio dentro de cada MP (iterando sobre los bordes de gráficos).
+0

Intente ejecutar la consulta del dispositivo en las muestras proporcionadas por AMD/NVIDIA en el SDK. Si desea conocer las consultas de dispositivos específicos del dispositivo, hay muchos que lo han puesto en línea. – nouveau

Respuesta

7
  1. CL_DEVICE_MAX_COMPUTE_UNITS debería darle el número de ComputeUnits, de lo contrario se puede echar un vistazo desde manuales apropiados (el AMD opencl programming guide y la Nvidia OpenCL programming guide)
  2. La guía vinculado para AMD contiene información acerca de la memoria local dotados por unidad de cómputo (generalmente 32kB/CU). Para NVIDIA, una búsqueda rápida en Google reveló this document, que le da a la memoria local un tamaño de 16kB/CU para las GPU basadas en G80 y G200. Para las tarjetas basadas en fermi (GF100) hay disponible 64kB de memoria onchip, que se puede configurar como memoria local de 48kB y memoria caché de 16kB L1 o memoria local de 16kB y 48kB L1. Además, las tarjetas basadas en fermi tienen un caché L2 de hasta 768kB (768kB para GF100 y GF110, 512kB para GF104 y GF114 y 384kB para GF106 y GF116, ninguno para GF108 y GF118 de acuerdo con wikipedia).
  3. De las informaciones anteriores parece que las tarjetas nvidia actuales tienen la mayor cantidad de memoria local por unidad de cómputo. Además, es el único con un Caché L2 general, según entiendo.

Para su uso de memoria local, debe recordar que la memoria local se asigna por grupo de trabajo (y solo accesible para un grupo de trabajo), mientras que una Unidad de cálculo puede mantener más de un grupo de trabajo. Entonces, si su algoritmo asignó la memoria local completa a un grupo de trabajo, no podrá usar la máxima cantidad de paralelismo. También tenga en cuenta que, dado que la memoria local está almacenada en bancos, el acceso aleatorio generará una gran cantidad de conflictos bancarios y serializaciones warp. Por lo tanto, es posible que su algoritmo no se pueda paralizar tan bien como cree que lo hará (o tal vez lo haga, simplemente mencionando la posibilidad).

Con una tarjeta basada en Fermi su mejor opción es contar con cachés en lugar de memoria local explícita, si todos sus grupos de trabajo operan con los mismos datos (no sé cómo cambiar la configuración de memoria L1/local))

+0

Ese es un punto muy interesante al que subes, mi algoritmo está consumiendo toda la memoria local por unidad de cómputo.¿Cuántos grupos de trabajo deberían ejecutarse en la misma unidad de cómputo para que funcione a (casi) la velocidad máxima? – user1111929

+0

Además, ese caché L2 suena interesante, pero no lo entiendo. Los dispositivos modernos tienen como 32 unidades de cómputo en ellos, y Fermi da una caché L2 de 768 KB, eso es solo 24 KB por unidad de cómputo (en comparación con 64 KB L1). Es decir. hay menos caché L2 que L1? ¿O estoy malinterpretando el objetivo de este caché? – user1111929

+0

Adición a mi primer comentario anterior: cada grupo de trabajo consistirá en unos pocos cientos de elementos de trabajo. – user1111929

Cuestiones relacionadas