Написание демонстрационного кода (умножение матриц) для моих учеников, чтобы показать, что человек ДОЛЖЕН правильно использовать кеш, даже при использовании параллельного кода, я обнаружил, что использование потоков 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, довольно удивительно и «аномально».