Я сейчас использую алгоритм, который очень тяжелый, но чрезвычайно параллельный.
Я искал способы ускорить его и заметил, что самая медленная операция у меня - это мояФункция VecAdd (вызывается тысячи раз на векторе шириной 6000 или более).
Она реализована следующим образом:
bool VecAdd( float* pOut, const float* pIn1, const float* pIn2, unsigned int num )
{
for( int idx = 0; idx < num; idx++ )
{
pOut[idx] = pIn1[idx] + pIn2[idx];
}
return true;
}
Это очень простой цикл, но все дополнения могут бытьвыполняется параллельно.Мой первый вариант оптимизации состоит в том, чтобы перейти к использованию SIMD, так как я могу легко ускорить это почти в 4 раза.
Однако меня также интересует возможность использования OpenMP и его автоматическая обработка потока дляцикл (потенциально дает мне еще 4-кратное ускорение в общей сложности в 16 раз с SIMD).
Однако он действительно работает медленно.При прямом цикле обработка данных моего примера занимает около 3,2 секунды.Если бы я вставил
#pragma omp parallel for
перед циклом for, я предполагал, что он выделит несколько блоков дополнений к другим потокам.
К сожалению, в результате получается, что обработка данных моего примера занимает ~ 7 секунд.
Теперь я понимаю, что большая часть моей проблемы здесь будет вызвана накладными расходами при настройке потоков и т. Д.но я все еще удивляюсь, насколько медленнее это заставляет вещи работать.
Можно ли ускорить это, каким-либо образом предварительно настроив пул потоков, или я никогда не смогу бороться с этими издержками?
Есть какие-нибудь мысли по поводу того, могу ли я это сделатькрасиво с OpenMP будет высоко ценится!