Имам този много прост паралелен код, който използвам, за да науча 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 използвайки.0 и изчисляване sgemm (матрица мултипликация) за 288 от 288 матрици, аз получа 350microsecs за ядра = 1 и 1177microsecs за ядра = 4, което просто изглежда като последователен код. Зададох свойството Intel MKL на Parallel (също така тествано с последователни) и езикови настройки за генериране на паралелен код (/ Qopenmp). Както и да подобри това? Аз работя в четириядрен процесорен процес
Отговори:
1 за отговор № 1Ако входният ви размер отнема само няколко микросекундида се изчисли, както казвате, няма начин 4 нишки да отнемат по-малко от това. По същество вашите входни данни са прекалено малки за паралелизация, защото в създаването на нишки има надморска височина.
Опитайте се да увеличите входните данни, така че отнемат няколко добри секунди и повторете експеримента.
Тогава може да има и фалшиво споделяне например, но на този етап това не е нищо, което да се има предвид.
Какво можете да направите, за да подобрите производителността, за да векторизирате кода (но в този случай не можете, защото използвате библиотечно повикване, т.е. вие трябва да напишете самата функция).