Извиняюсь за не правильное определение проблемы в названии топика. Правильное описание прооблемы - в третьем посте. В двух тредах параллельно выполняются ijlXXX На однопроцессорной машине все ок. На двухпроцессорной- в одном из тредов функции выдают IJL_EXCEPTION_DETECTED JPEG_CORE_PROPERTIES, конечно, для каждого треда свои. Например, в одном треде запускаем ijlWrite В другом параллельно- ijlInit в результате ijlWrite заканчивается IJL_EXCEPTION_DETECTED Если посмотреть что он успел накодировать- там не полностью закодированный jpg, т.е. как будто процесс кодирования прервали. Может кто-нибудь подсказать в каком направлении думать? Может быть, надо компилировать с помощью какого-нибудь Intel компилятора? На это меня натолкнуло сообщение Note, JPEG codec is threaded with using OpenMP API, so if you want to take advantage of modern dual core systems or old SMP systems you need to compile codec with Intel C/C++ compiler or MS VC2005 compiler, see Makefile for necessary options. Please let us know your feeling regarding functionality and performance of IPP JPEG codec. тут: http://74.125.77.132/search?q=cache:OpVS3_S6EwMJ:software.intel.com/en-us/forums/intel-integrated-performance-primitives/topic/53350+%22JPEG+codec+is+threaded+with+using+OpenMP+API,+so+if+you+want+to+take+advantage&hl=ru&ct=clnk&cd=1&gl=ru
Извиняюсь, уточнение- процессоров не два. Один процессор Pentium4 3GHz Hyper-threading Именно на нем возникает проблема при запуске функций Intel Jpeg Library одновременно в разных threads.
Правильное описание проблемы: Использую библиотеку Intel Jpeg Library ( ijl15.dll ). На однопроцессорной машине Win32 с P4 HyperThreading выполнение функций из библиотеки одновременно в разных созданных threads заканчивается ошибкой- IJL_EXCEPTION_DETECTED После поиска по форуму понял, что в HyperThreading есть сложность при доступе к одним адресам памяти из разных тредов. У меня, как я понял, эта проблема возникает внутри библиотеки ijl. Тогда вопрос- зачем же он нужен, этот HyperThreading, если его приходится отключать для того, что бы чтото работало?
Если не разрабатывалась как thread safe, то единственный способ раобтать с ней в параллельных тредах- отключать HT? Баг- у такой известной библиотеки врядли.
Уверен, HyperThreading непричем. Просто кривая синхронизация (или вообще отсутствие таковой) Можно сделать обертки (wrapers) над вызовами библиотеки и внутри юзать синхронизацию (CriticalSections) при доступе к разделяемой памяти. Известность - не гарантия отсутствия багов.
Нет. При работе на машине без HyperThreading все выполняется в параллельных тредах аюсолютно без проблем.
Нет. Тестировалось только на машине с одним процессором без HT - ошибок нет, с одним процессором с HT - есть указанная проблема.
В смысле- threads, в которых пораллельно выполняются ijl функции, обращаются к одной и той же памяти без принятия мер по синхронизации? С моей стороны- нет. Внутри библиотеки- не знаю.
prog По поведению потоков ты и не догодаешься что процессора два или один с гт. Под отладчик и смотри что являетсо причиной ошибки. Как вариант установить аффинитет процесса в 1.
Как это не догадываюсь? Тестировал на: P4 2.4Ghz без поддержки HT - при работе в параллельных threads ошибок нет P4 3.0Ghz HT - при работе в параллельных threads ошибка есть
Да. Обычный старенький P4 2.4 В нем нет поддержки HT - при его производмстве эта технология еще была наверное только на бумаге.
prog Учи матчасть http://en.wikipedia.org/wiki/Affinity_mask Когла поймёшь, юзой SetProcessAffinityMask(-1, 1) и будет тебе счастье)
Дык, я это понял. Поэтому и вопрос- если проблема решается заданием "выполнять этот процесс только одним 'процессором'", то, блин, зачем тогда нужен этот HT??? Я вообще-то хотел бы использовать его плюсы, а мне надо его отключать..
prog Ты его не отключишь. Просто когда все потоки допущены к исполнению на одном процессоре, то они исполняютсо последовательно, ни о каких атомарных операциях речь идти не может, два потока не могут одновременно обратитсо к одному ресурсу, ибо процессор один выполняет один поток. Если процнссоров несколько(неважно это реально два кристалла или гт), то каждый из них исполняет свой поток и тут должны применятбся меры по синхронизации доступа к ресурсам, а модуля походу кривые вот и проблемы отсюдо, допускай исполняться все потоки на одном процессоре, тем самым исчезнет необходимость синхронизации.
Но тогда производительность именно моего приложения будет менбше, чем если бы библиотека была thread-safety?
prog Приоритет повысь, да и вообще на производительность аффинитет мало скажетсо. В любом случае ты используешь сторонний модуль, который содержит ошибки, поэтому выбора у тебя нет.