OpenMP: Будут ли разные области памяти ускорять циклы? - PullRequest
0 голосов
/ 17 марта 2019

У меня есть программа OpenMP, которая вычисляет переменные в цикле.

int a[1000000];
int b[1000000];
int c[1000000];
int d[1000000];

#pragma omp parallel for private(i) shared(a,b,c,d)
for (i=0;i<1000000;++i)
{
d[i] = b[i]*a[i] + c[i]+10;
}

Я использовал perf и perf сказал, что узким местом является чтение и запись в памяти.

Первый вопрос: можно ли разбить массивы A, B, C, D и поместить их в разные банки памяти с помощью OpenMP?

Второй вопрос: если я разделю массивы A, B, C, D на более мелкие, ускорят ли они выполнение цикла?

1 Ответ

0 голосов
/ 18 марта 2019
  • Первый вопрос: можно ли разбить массивы A, B, C, D и поместить их в разные банки памяти с помощью OpenMP?

Насколько мне известно, нет, вы не можете явно разбивать массивы с помощью функций времени выполнения OpenMP. Что делает OpenMP, так это приписывает равную нагрузку на работу каждому потоку. Допустим, вы определили OMP_NUM_THREADS = 10 , тогда каждый поток получит 100000 итераций для выполнения. Или последний поток получит меньше работы, если остаток не равен 0. (То, что вы можете сделать, это назначить привязку потока к ядрам.)

  • Второй вопрос: если я разделю массивы A, B, C, D на меньшие массивы, они ускорят выполнение цикла?

Нет. Но вы можете увеличить количество потоков, чтобы получить лучшую производительность (до тех пор, пока издержки потоков не превысят ускорение)

...