Я запускаю программу захвата камеры, которая выполняет обработку полученных изображений, и я использую простые директивы OpenMP для этой обработки. Поэтому в основном я жду изображения с камеры, а затем обработаю его.
При переносе на VC2010 я вижу очень странную производительность hog: под VC2010 мое приложение занимает почти 100% процессор, в то время как он занимает всего 10% под VC2008.
Если я сравниваю только код обработки, я не получаю никакой разницы между 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
Я также сделал несколько профилей concurrency:
В 2008 году обработка обрабатывается по 3 рабочим потокам, которые очень легко активны, поскольку время обработки намного хуже, чем время ожидания изображения.
Те же потоки появляются в 2010 году, но все они на 100% заняты функцией PartialBarrierN::Block
. Поскольку у меня есть четыре ядра, они потребляют 75% работы, что примерно соответствует тому, что я вижу при загрузке процессора.
Таким образом, похоже, что существует конфликт между OpenMP и библиотекой приобретения Matrox (патентованной). Но это ошибка VS2010 или Matrox? Я могу что-нибудь сделать? Использование VС++ 2010 является обязательным для меня, поэтому я не могу просто придерживаться 2008 года.
Большое спасибо
ОБНОВЛЕНИЕ СОСТОЯНИЯ
Использование новой структуры concurrency, как было предложено DeadMG, приводит к 40% CPU. Профилирование показывает, что время тратится на обработку, поэтому он не показывает ошибку, которую я вижу с помощью OpenMP, но производительность в моем случае намного хуже, чем OpenMP.
ОБНОВЛЕНИЕ СОСТОЯНИЯ 2
Я установил оценочную версию новейшего Intel С++. Он показывает точно такие же проблемы с производительностью!!
Я перешел на форум MSDN
ОБНОВЛЕНИЕ СОСТОЯНИЯ 3
Протестировано на Windows 7 64 бит и XP 32 бит с точно такими же результатами (на той же машине)