2016-12-17 6 views
0

Я играл с OpenMP, и я пытаюсь посмотреть, могу ли я получить ускорение в определенном фрагменте кода на C++.OpenMP-распараллеливание с элементами массива

#pragma omp parallel for 
    for (Index j=alignedSize; j<size; ++j) 
    { 
     res[j] = cj.pmadd(lhs0(j), pfirst(ptmp0), res[j]); 
     res[j] = cj.pmadd(lhs1(j), pfirst(ptmp1), res[j]); 
     res[j] = cj.pmadd(lhs2(j), pfirst(ptmp2), res[j]); 
     res[j] = cj.pmadd(lhs3(j), pfirst(ptmp3), res[j]); 
    } 

Я полный новичок с OpenMP так нежна со мной, но кто-то может пролить некоторый свет на то, почему этот код заканчивается удвоение времени выполнения, а не ускоряя его?

Я бегу с 4 ядрами, на всякий случай это важно.

+0

Как вы измерили время? Каковы ваши конкретные результаты? Можете ли вы предоставить код в виде [mcve]? Какова конкретная модель процессора и настройка памяти в системе? – Zulan

ответ

2

Какой размер записи res? Если его размер меньше, чем размер строки кэша, то его вероятность false sharing.

+0

Запись res занимает 8 байтов, и поэтому, предполагая длину кеша длиной 64 байта, похоже, я хотел бы назначить 8 итераций на поток? Что-то вроде '#pragma omp parallel для расписания (static, 8)'? – alairbyday

+0

Да, выглядит правильно. – David

0

Голый минимум для типичного процессора будет составлять 128 байт, а затем вам понадобится унифицированный кеш последнего уровня.