Мне нужна идея, как написать кросс-платформенную реализацию нескольких параллелизуемых задач на С++ таким образом, чтобы я мог использовать преимущества SIMD (SSE, SPU и т. д.), если они доступны. А также я хочу иметь возможность во время выполнения переключаться между SIMD и не SIMD.
Как бы вы предложили мне решить эту проблему? (Конечно, я не хочу решать проблему несколько раз для всех возможных вариантов)
Я понимаю, что это может быть не очень простой задачей с C++, но я считаю, что что-то упускаю. Пока моя идея выглядит так... Класс cStream будет массивом из одного поля. Используя несколько cStreams, я могу достичь SoA (структуры массивов). Затем, используя несколько функторов, я могу подделать лямбда-функцию, которую мне нужно выполнить для всего 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)));
}
Где for_each будет отвечать за инкрементирование текущего указателя потоков, а также встраивание тела функторов с SIMD и без SIMD.
как-то так:
// 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>());
}
Обратите внимание, что если SIMD включен, он проверяется один раз и что цикл находится вокруг основного функтора.