Necesito alguna idea sobre cómo escribir una implementación multiplataforma C++ de algunos problemas paralelizables de forma que pueda aprovechar SIMD (SSE, SPU, etc.) si está disponible. Además, quiero poder en el tiempo de ejecución cambiar entre SIMD y no SIMD.SIMD o no SIMD - multiplataforma
¿Cómo me sugerirías para abordar este problema? (Por supuesto que no quiero implementar el problema varias veces para todas las opciones posibles)
Veo que esta tarea puede no ser muy fácil con C++, pero creo que me falta algo. Hasta ahora mi idea se parece a esto ... Una clase cStream será una matriz de un solo campo. Usando múltiples cStreams puedo lograr SoA (Estructura de matrices). Luego, usando algunos Funtores puedo falsificar la función Lambda que necesito que se ejecute en todo el cStream.
// just for example I'm not expecting this code to compile
cStream a; // something like float[1024]
cStream b;
cStream c;
void Foo()
{
for_each(
AssignSIMD(c, MulSIMD(AddSIMD(a, b), a)));
}
Dónde for_each será responsable de incrementar el puntero actual de las corrientes, así como inlining cuerpo de los funtores con SIMD y sin SIMD.
algo así:
// just for example I'm not expecting this code to compile
for_each(functor<T> f)
{
#ifdef USE_SIMD
if (simdEnabled)
real_for_each(f<true>()); // true means use SIMD
else
#endif
real_for_each(f<false>());
}
Tenga en cuenta que si el SIMD está activado se comprueba una vez que el bucle es de alrededor del funtor principal.
Consulte la biblioteca [libsimdpp] (https://github.com/p12tic/libsimdpp): prácticamente hace lo que usted solicita. Solo necesita escribir sus algoritmos una vez: el mismo código fuente se puede compilar varias veces con diferentes opciones de compilación (los espacios de nombres se ocupan de ODR), vinculados en el mismo ejecutable y la biblioteca seleccionará automáticamente la mejor implementación para el procesador de destino. (descargo de responsabilidad: soy el autor) – user12