Мне нужно некоторое представление о том, как написать кросс-платформенную реализацию С++ из нескольких параллелизуемых проблем таким образом, чтобы я мог использовать SIMD (SSE, SPU и т.д.), если они доступны. Я также хочу, чтобы во время выполнения переключался между SIMD, а не SIMD.
Как бы вы предложили мне подойти к этой проблеме? (Конечно, я не хочу многократно реализовывать проблему для всех возможных опций)
Я вижу, как это может быть непростой задачей с С++, но я считаю, что что-то не хватает. Пока моя идея выглядит так... Класс cStream будет массивом одного поля. Используя несколько cStreams, я могу достичь SoA (Structure of Arrays). Затем, используя несколько Функторов, я могу подделать функцию Lambda, которую мне нужно выполнить в течение всего 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 включен, один раз проверяется и что цикл находится вокруг главного функтора.