Отмечено аномальное ускорение при использовании потоков C ++ 2011 вместо OpenMP при умножении матриц - PullRequest
2 голосов
/ 11 марта 2012

Написание демонстрационного кода (умножение матриц) для моих учеников, чтобы показать, что человек ДОЛЖЕН правильно использовать кеш, даже при использовании параллельного кода, я обнаружил, что использование потоков C ++ 2011 (через boost::thread) превосходит OpenMP ( параллельно для) потоков более чем в 2 раза!

Единственное возможное объяснение, которое я могу себе представить, это то, что в C ++ 2011 каждый поток всегда работает на одном и том же ядре. Так что есть возможность хранить данные в кеше.

Может ли это быть реальным?

Демонстрационный код довольно длинный (и скучно с той же самой матрицей инициализации и многократного повторения четыре раза в правильном, неправильном (плохой доступ к кешу), скаляр и OpenMP) и может быть найден по адресу:

http://www.giuseppelevi.com/uploads/3/2/9/8/3298932/matrix_mul_boost_thread.cpp

Я использую компилятор VS2010. BOOST 1.45 Процессор: Intel Core I5 ​​M430. omp_get_wtime() был использован для профилирования каждой его части. Чтобы набрать несколько чисел, я получил следующие цифры:

Скалярное время выполнения: 14,42 с

BOOST Thread: 2.28

OpenMP Thread: 5.10

Поскольку есть только 2 физических ядра с гиперпоточностью, ускорение 6.31 (по сравнению со скаляром), полученное с помощью BOOST Thread, довольно удивительно и «аномально».

1 Ответ

0 голосов
/ 05 мая 2012

По умолчанию будет использоваться расписание (статическое, 1), что часто приводит к ложному совместному использованию и может иногда приводить к неоптимальному планированию. Вместо этого попробуйте расписание (руководствуясь), это часто приводит к гораздо лучшему масштабированию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...