Мне нужна идея, как написать кроссплатформенную реализацию C ++ для нескольких распараллеливаемых задач таким образом, чтобы я мог использовать 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 включен, проверяется один раз, и петля проходит вокруг главного функтора.