- 24 темы
я есть следующий код в моей программе, и я хочу ускорить его с помощью OpenMP.
...
for(i=curr_index; i < curr_index + rx_size; i+=2){
int64_t tgt = rcvq[i];
int64_t src = rcvq[i+1];
if (!TEST(tgt)) {
pred[tgt] = src;
newq[newq_count++] = tgt;
}
}
В настоящее время у меня есть версия следующим образом:
...
chunk = rx_sz / omp_nthreads;
#pragma omp parallel for num_threads(omp_nthreads)
for (ii = 0; ii < omp_nthreads; ii++) {
int start = curr_index + ii * chunk;
for (index = start; index < start + chunk; index +=2) {
int64_t tgt = rcvq[index];
int64_t src = rcvq[index+1];
if (!TEST(tgt)) {
pred[tgt] = src;
#pragma omp critical
newq[newq_count++] = tgt;
}
}
}
Когда я запускаю версию OpenMP, я вижу значительное снижение производительности по сравнению с оригинальной версией. Я думаю, что проблема может быть из-за «omp критического», который предотвращает параллельную обработку. Я хочу знать, что можно улучшить с помощью моего кода, чтобы повысить производительность по сравнению с последовательной версией. В коде rx_sz всегда кратен omp_nthreads.