2 ядра - 2 потока - не получается распараллелить

Тема в разделе "WASM.WIN32", создана пользователем Magnum, 11 июл 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    САБЖ
    Есть 2х ядерный атлон
    Есть 2 массива данных
    Есть одна программа (читай один процесс) для сортировки

    Хочу выиграть в производительности
    Создаю 2 потока, внутри которых процедуры сортировки - каждый поток сортирует свой массив

    смотрю в диспетчере задач - проц загружен только на 50%
    т.е. лопатит лишь одно ядро
    Если создать удаленный поток в другом процессе - тогда 100% загрузка - работают оба ядра видать

    вопрос: почему из одного процесса не получается подключить к делу оба ядра?
    Что я делаю не так?

    Треды создаю обычным CreateThread()
     
  2. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    мне кажется, что процессору виднее, почему так.. а сталобыть выигрыша может и не быть
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    не процессору а OS, Magnum попробуй поставь задержку перед выполнением второго потока, возмоможно Ось увидит что первое ядро загружено и создаст поток на втором.

    ps: это предпложение =)
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Magnum
    Смотри функции
    SetProcessAffinityMask
    SetThreadAffinityMask
    но сначала глянь в диспетчере задач на каких ядрах может выполняться программа.
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Magnum
    И еще, наверное, нужно поставить потокам сответсвующий приоритет, чтобы процессор все свое время отдал именно им.
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    а кикаие значения она принимает, в msdn написано только

    dwThreadAffinityMask [in]

    The affinity mask for the thread.

    и где эту маску брать?
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    По GetProcessAffinityMask определяешь доступные для процесса номера процессоров и потом одному потоку назначаешь один номер, другому другой
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    2FED
    В Ремарках написано же:
    Нитевая Сродство-Маска есть битовый вектор, в котором каждый бит представляет процессор, на котором данная нить может бежать. Нитевая Сродство-Маска должна быть подмножеством Сродство-Маски процесса, к которому относится эта нить.

    0x00000001 <- Только на первом процессоре
    0x00000002 <- Только на втором процессоре
    0x00000003 <- Только на первом и втором процессорах
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а господи, перевод промпта Affinity mask чтоли?)))))