Parece ser una publicación anterior, pero permítanme actualizar esta publicación con información nueva. Con suerte, podría ayudar a alguien más.
el tamaño sí Trabajo Global (Dimensiones) tienen que ser múltiplo de Grupo de Trabajo tamaño (dimensiones) en OpenCL?
Respuesta: True till OpenCL 2.0. Antes de CL2.0, su tamaño de trabajo global debe ser un múltiplo del tamaño de trabajo local; de lo contrario, recibirá un mensaje de error cuando ejecute clEnqueueNDRangeKernel.
Pero desde CL2.0, ya no es necesario. Puede usar cualquier tamaño de trabajo global que se ajuste a las dimensiones de su aplicación. Sin embargo, recuerde que la implementación de hardware podría seguir utilizando la forma "antigua", lo que significa rellenar el tamaño del grupo de trabajo global. Por lo tanto, hace que el rendimiento dependa en gran medida de la arquitectura del hardware. Puede ver un rendimiento bastante diferente en diferentes hardware/plataformas. Además, desea que su aplicación vuelva a ser compatible para admitir una plataforma más antigua que solo admita CL hasta la versión 1.2. Por lo tanto, creo que esta nueva característica añadida en CL2.0 es sólo para una fácil programación, para obtener un mejor rendimiento controlable y compatibilidad con versiones anteriores, le sugiero que todavía utiliza el siguiente método mencionado por usted:
aumentar las dimensiones de la trabajo global para ser el múltiplo más cercano de las dimensiones del grupo de trabajo, manteniendo todos los búferes de entrada y salida el mismo pero verificando los límites en el kernel para evitar segfaulting, es decir, hacer nada en los elementos de trabajo sin límite del resultado deseado. (Esto parece la mejor manera).
Respuesta: tiene toda la razón. Esta es la forma correcta de manejar este caso. Diseñe con cuidado el tamaño del grupo de trabajo local (teniendo en cuenta factores como el uso del registro, el acierto/fallo de la memoria caché, el patrón de acceso a la memoria, etc.). Y luego agregue su tamaño de trabajo global a un múltiplo del tamaño de trabajo local. Entonces, ya puedes irte.
Otra cosa a tener en cuenta es que puede utilizar el objeto de imagen para almacenar los datos en lugar del búfer, si hay bastante trabajo de comprobación de límites en su kernel. Para la imagen, la verificación de límites se realiza automáticamente por hardware, casi sin gastos generales en la mayoría de las implementaciones. Por lo tanto, rellenando su tamaño de trabajo global, almacene sus datos en un objeto de imagen, luego, solo necesita escribir su código normalmente sin preocuparse por la verificación de límites.
Es interesante que usted haga esta pregunta, ya que yo mismo la estaba preguntando. Mi primera suposición es que mantienes un tamaño de grupo de trabajo fijo y manejas fuera de límite por una rama if. – Stringer