Я использую программу сбора данных с камеры, которая выполняет обработку полученных изображений, и я использую простые директивы OpenMP для этой обработки. В общем, я жду изображение с камеры, а затем обрабатываю его.
При переходе на VC2010 я вижу очень странный скачок производительности: под VC2010 мое приложение использует почти 100% ЦП, а по сравнению с VC2008 - только 10%.
Если я сравниваю только код обработки, я не получаю никакой разницы между VC2010 и VC2008, разница возникает при использовании функций сбора данных.
Я сократил код, необходимый для воспроизведения проблемы, до простого цикла, который выполняет следующие действия:
for (int i=0; i<1000; ++i)
{
GetImage(buffer);//wait for image
Copy2Array(buffer, my_array);
long long sum = 0;//do some simple OpenMP parallel loop
#pragma omp parallel for reduction(+:sum)
for (int j=0; j<size; ++j)
sum += my_array[j];
}
Этот цикл потребляет 5% ЦП в 2008 году и 70% в 2010 году.
Я провел некоторое профилирование, которое показывает, что в 2010 году большую часть времени проводит в OpenMP vcomp100.dll!_vcomp::PartialBarrierN::Block
Я также выполнил некоторое профилирование параллелизма:
В 2008 году обработка обрабатывается по 3 рабочим потокам, которые очень слабо активны, поскольку время обработки значительно уступает времени ожидания изображения
Те же потоки появляются в 2010 году, но все они на 100% заняты функцией PartialBarrierN::Block
. Поскольку у меня четыре ядра, они потребляют 75% работы, что примерно соответствует тому, что я вижу при загрузке процессора.
Похоже, что существует конфликт между OpenMP и библиотекой сбора Matrox (проприетарной). Но это ошибка VS2010 или Matrox?
Что я могу сделать? Использование VC ++ 2010 является для меня обязательным, поэтому я не могу просто придерживаться 2008 года.
Большое спасибо
ОБНОВЛЕНИЕ СОСТОЯНИЯ
Использование новой среды параллелизма, как предложено DeadMG, приводит к 40% CPU. Профилирование показывает, что время тратится на обработку, поэтому оно не показывает ошибку, которую я вижу с OpenMP, но производительность в моем случае намного ниже, чем у OpenMP.
ОБНОВЛЕНИЕ СОСТОЯНИЯ 2
Я установил ознакомительную версию последней версии Intel C ++. Это показывает те же проблемы с производительностью!
Я сделал кросс-пост на MSDN forum
ОБНОВЛЕНИЕ СОСТОЯНИЯ 3
Протестировано на 64-битной Windows 7 и 32-битной XP, с точно такими же результатами (на том же компьютере)