- 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.

Ответы на вопрос(2)

Ваш ответ на вопрос