intel compiler + openmp + x64

Добрый день!

Подскажите, что делать в такой ситуации:
Есть цикл, который распараллелен с помощью OpenMP
Например:

#pragma omp parallel for
for( int indexW = 0; indexW < w; indexW ++ )
{
BYTE &dst = img.at( indexW );
dst /= 2;
}


Вокруг него поставлены маркеры VMProtectBeginUltra.
для разработки использую visual studio 2008 + intel C++ composer XE 2011 Update 7.
Программа падает на этом цикле, если используется следующее сочетание:

  1. платформа - x64
  2. компилятор - intel
  3. конфигурация - release
  4. openmp включен
    Во всех остальных вариантах - работает, то есть например, если исопльзовать компилятор из visual studio - все в порядке

архив с проектом, исходником и бинарниками.

На самом деле проблема была в реальном проекте, начал копать и оказалось, что даже в таком простом месте воспроизводится бага. В исходном проекте было немного по-другому. Там было два цикла, оба распараллелены через openmp. У одного именованный маркер сохранялся и был виден в GUI VMprotect, а у другого - маркер почему-то отображался неименованным. Ну и программа падала.
Подобные штуки у меня периодически всплывают и решать приходится перестановкой маркера или инструкций местами. Что я делаю не так? Или это бага компилятора/vmprotect?

А можно еще куда-нибудь выложить libiomp5md.dll?

да, извините, забыл про него

Оригинальный файл не хочет запускаться:


TestOMPSlock.exe - Ошибка приложения

Ошибка при запуске приложения (0xc000007b). Для выхода из приложения нажмите кнопку “ОК”.

ОК

Извините, это была версия dll для Win32
вот версия для x64: Dropbox - Error - Simplify your life

Еще оригинальный файл имеет зависимость от VMprotectSDK64.dll.

Удалось запустить?

Исправленная версия отправлена на емаил, указанный при покупке VMProtect.
Проверяйте.

Потестировал. Не помогло, падает так же

Исходники с бинарниками

Только бинарники

А теперь падает совершенно по другой причине. Компилятор вывел одну ветку кода за границы маркера и в конце сделал обратный переход обратно. Вмпротект ничего не знает про такой финт ушами.

В версии 3.0 будет полностью переделан алгоритм определения границ маркера и такой проблемы больше не возникнет.