Estoy intentando comprender la arquitectura de los dispositivos OpenCL, como las GPU, y no veo por qué hay un límite explícito en la cantidad de elementos de trabajo en un grupo de trabajo local, es decir, la constante CL_DEVICE_MAX_WORK_GROUP_SIZE.¿Por qué hay CL_DEVICE_MAX_WORK_GROUP_SIZE?
Me parece que esto debe ser resuelto por el compilador, es decir, si se ejecuta un kernel (unidimensional por simplicidad) con un tamaño de grupo de trabajo local 500 mientras que su máximo físico es 100, y el kernel busca un ejemplo de esta manera:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(i);
barrier();
moreCode(i);
barrier();
finalCode(i);
}
entonces podría ser convertido automáticamente a una ejecución con el tamaño del grupo de trabajo 100 en este núcleo:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(5*i);
someCode(5*i+1);
someCode(5*i+2);
someCode(5*i+3);
someCode(5*i+4);
barrier();
moreCode(5*i);
moreCode(5*i+1);
moreCode(5*i+2);
moreCode(5*i+3);
moreCode(5*i+4);
barrier();
finalCode(5*i);
finalCode(5*i+1);
finalCode(5*i+2);
finalCode(5*i+3);
finalCode(5*i+4);
}
sin embargo, parece que esto no se hace por defecto. Por qué no? ¿Hay alguna manera de automatizar este proceso (que no sea escribir un precompilador para mí)? ¿O hay un problema intrínseco que puede hacer que mi método falle en ciertos ejemplos (y puede darme uno)?
Pondría cinco llamadas de función en una secuencia, ¿no? Entonces sería una especie de retroceso, solo. También debería asegurarse de rellenar su dimensión de trabajo a un múltiplo de cinco. Solo me preguntaba ... – rdoubleui