【发布时间】:2017-08-20 19:28:00
【问题描述】:
我的程序中有以下代码,我想使用 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 critical”阻止了并行处理。我想知道我的代码可以增强什么,这样我就可以获得比串行版本更好的性能。在代码中,rx_sz 始终是 omp_nthreads 的倍数。
【问题讨论】:
标签: c multithreading openmp race-condition