SIMD или не SIMD - кросс-платформенный

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

12
задан Aleks 23 January 2010 в 08:11
поделиться