IJL + multithreads + 2 CPU

Тема в разделе "WASM.BEGINNERS", создана пользователем prog, 16 дек 2008.

  1. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Извиняюсь за не правильное определение проблемы в названии топика.
    Правильное описание прооблемы - в третьем посте.

    В двух тредах параллельно выполняются 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
     
  2. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Извиняюсь, уточнение- процессоров не два.
    Один процессор Pentium4 3GHz Hyper-threading
    Именно на нем возникает проблема при запуске функций Intel Jpeg Library одновременно в разных threads.
     
  3. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Правильное описание проблемы:

    Использую библиотеку Intel Jpeg Library ( ijl15.dll ).
    На однопроцессорной машине Win32 с P4 HyperThreading выполнение функций из библиотеки одновременно в разных созданных threads заканчивается ошибкой- IJL_EXCEPTION_DETECTED

    После поиска по форуму понял, что в HyperThreading есть сложность при доступе к одним адресам памяти из разных тредов.
    У меня, как я понял, эта проблема возникает внутри библиотеки ijl.

    Тогда вопрос- зачем же он нужен, этот HyperThreading, если его приходится отключать для того, что бы чтото работало?
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Или библиотека не разрабатывалась как thread safe, или bug в этой самой библиотеке.
     
  5. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Если не разрабатывалась как thread safe, то единственный способ раобтать с ней в параллельных тредах- отключать HT?

    Баг- у такой известной библиотеки врядли.
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Уверен, HyperThreading непричем. Просто кривая синхронизация (или вообще отсутствие таковой)
    Можно сделать обертки (wrapers) над вызовами библиотеки и внутри юзать синхронизацию (CriticalSections) при доступе к разделяемой памяти.

    Известность - не гарантия отсутствия багов.
     
  7. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Нет. При работе на машине без HyperThreading все выполняется в параллельных тредах аюсолютно без проблем.
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Без HyperThreading - это на одном процессоре? Тестировалось ли на двухъядерном ?
     
  9. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Нет.
    Тестировалось только на машине с одним процессором без HT - ошибок нет,
    с одним процессором с HT - есть указанная проблема.
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Если и на двухпроцессорном ошибка вылезет, то однозначно проблема с синхронизаций потоков.
     
  11. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    В смысле- threads, в которых пораллельно выполняются ijl функции, обращаются к одной и той же памяти без принятия мер по синхронизации?

    С моей стороны- нет. Внутри библиотеки- не знаю.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prog
    По поведению потоков ты и не догодаешься что процессора два или один с гт.
    Под отладчик и смотри что являетсо причиной ошибки.
    Как вариант установить аффинитет процесса в 1.
     
  13. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Как это не догадываюсь?
    Тестировал на:

    P4 2.4Ghz без поддержки HT - при работе в параллельных threads ошибок нет
    P4 3.0Ghz HT - при работе в параллельных threads ошибка есть
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Там скока ядер, одно ?
     
  15. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Да.
    Обычный старенький P4 2.4
    В нем нет поддержки HT - при его производмстве эта технология еще была наверное только на бумаге.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prog
    Учи матчасть http://en.wikipedia.org/wiki/Affinity_mask
    Когла поймёшь, юзой SetProcessAffinityMask(-1, 1) и будет тебе счастье)
     
  17. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Дык, я это понял.
    Поэтому и вопрос- если проблема решается заданием "выполнять этот процесс только одним 'процессором'", то, блин, зачем тогда нужен этот HT???
    Я вообще-то хотел бы использовать его плюсы, а мне надо его отключать..
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prog
    Ты его не отключишь. Просто когда все потоки допущены к исполнению на одном процессоре, то они исполняютсо последовательно, ни о каких атомарных операциях речь идти не может, два потока не могут одновременно обратитсо к одному ресурсу, ибо процессор один выполняет один поток. Если процнссоров несколько(неважно это реально два кристалла или гт), то каждый из них исполняет свой поток и тут должны применятбся меры по синхронизации доступа к ресурсам, а модуля походу кривые вот и проблемы отсюдо, допускай исполняться все потоки на одном процессоре, тем самым исчезнет необходимость синхронизации.
     
  19. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Но тогда производительность именно моего приложения будет менбше, чем если бы библиотека была thread-safety?
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prog
    Приоритет повысь, да и вообще на производительность аффинитет мало скажетсо. В любом случае ты используешь сторонний модуль, который содержит ошибки, поэтому выбора у тебя нет.