/ / Ниска ефективност за неудобно паралелен код - c ++, паралелна обработка, openmp, intel-mkl, неудобно-паралелно

Ниска ефективност за неудобно паралелен код - c ++, паралелна обработка, openmp, intel-mkl, неудобно паралелно

Имам този много прост паралелен код, който използвам, за да науча 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 нишки да отнемат по-малко от това. По същество вашите входни данни са прекалено малки за паралелизация, защото в създаването на нишки има надморска височина.

Опитайте се да увеличите входните данни, така че отнемат няколко добри секунди и повторете експеримента.

Тогава може да има и фалшиво споделяне например, но на този етап това не е нищо, което да се има предвид.

Какво можете да направите, за да подобрите производителността, за да векторизирате кода (но в този случай не можете, защото използвате библиотечно повикване, т.е. вие трябва да напишете самата функция).