Низкая производительность для смущающе параллельного кода
У меня есть этот очень простой параллельный код, который я использую для изучения openmp, который смущающе параллелен. Тем не менее, я не получаю суперлинейного или, по крайней мере, линейного увеличения производительности.
#pragma omp parallel num_threads(cores)
{
int id = omp_get_thread_num();
cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, row, column, column, 1.0, MatrixA1[id], column, MatrixB[id], column, 0.0, Matrixmultiply[id], column);
}
В Visual Studio с использованием компилятора Intel C++ xe 15.0 и вычислений sgemm (умножение матриц) для матриц 288 на 288 я получаю 350 микросек для ядер =1 и 1177 микросек для ядер =4, что выглядит просто как последовательный код. Я установил для свойства Intel MKL значение "Параллельный" (также протестировано с последовательным интерфейсом), а для параметра "Язык" - "Создать параллельный код" (/Qopenmp). В любом случае, чтобы улучшить это? Я работаю в четырехъядерном процессоре haswell
1 ответ
Если ваш входной размер занимает всего несколько микросекунд, как вы говорите, ни в коем случае нельзя использовать 4 потока меньше этого. По сути, ваши входные данные слишком малы для распараллеливания, поскольку при создании потоков возникают накладные расходы.
Попробуйте увеличить входные данные, чтобы это заняло несколько секунд, и повторите эксперимент.
Например, у вас также может быть ложный обмен информацией, но на данный момент это нечего рассматривать.
Что вы можете сделать для повышения производительности, это векторизовать код (но в этом случае вы не можете этого сделать, потому что вы используете библиотечный вызов, то есть вам придется написать функцию самостоятельно).