gpt4 book ai didi

c - 单线程 OpenMP 与顺序的开销

转载 作者:行者123 更新时间:2023-11-30 17:26:06 24 4
gpt4 key购买 nike

我正在使用 OpenMP,并且偶然发现了一些我不明白的东西。我正在使用以下并行代码(工作正常)。当使用两倍以上的线程时,其执行时间几乎减半。然而,使用 OpenMP 的一个线程的执行时间是 35 秒,而当我注释编译指示时,它减少到 25 秒!我可以做些什么来减少这个巨大的开销吗?我正在使用 gcc 4.8.1 并使用“-O2 -Wall -fopenmp”进行编译。

我读过类似的主题( OpenMP with 1 thread slower than sequential versionOpenMP overhead ) - 意见从没有开销到很多开销都有所不同。我很好奇是否有更好的方法在我的特定情况下使用 OpenMP(for 循环和并行 for 内部)。

for (size_t k = 0 k < maxk; ++k) { // k is ~5000
// init reduction variables
const bool is_time_for_reduction = ;// init from k
double mmin = INFINITY, mmax = -INFINITY;
double sum = 0.0;


#pragma omp parallel shared(m1, m2)
{
// w, h are both between 1000 and 2000
#pragma omp for
for (size_t i = 0; i < h; ++i) { // w,h - consts
for (size_t j = 0; j < w; ++j) {
// computations with matrices m1 and m2, using only m1,m2 and constants w,h
}
}

if (is_time_for_reduction) {
#pragma omp for reduction (max/min/sum: mmax,mmin,sum)
for (size_t i = 0; i < h; ++i) {
for (size_t j = 0; j < w; ++j) {
// reductions
}
}
}
}


if (is_time_for_reduction) {
// use "reduced" variables
}
}

最佳答案

我认为没有理由更改您的原始顺序代码。我会尝试这个:

for (size_t k = 0 k < maxk; ++k) {
// init reduction variables
const bool is_time_for_reduction = ;// init from k
double mmin = INFINITY, mmax = -INFINITY;
double sum = 0.0;

#pragma omp parallel for
for (size_t i = 0; i < h; ++i) { // w,h - consts
for (size_t j = 0; j < w; ++j) {
// computations with matrices m1 and m2, using only m1,m2 and constants w,h
}
}

if (is_time_for_reduction) {
#pragma omp parallel for reduction (max/min/sum: mmax,mmin,sum)
for (size_t i = 0; i < h; ++i) {
for (size_t j = 0; j < w; ++j) {
// reductions
}
}
// use "reduced" variables
}
}

关于c - 单线程 OpenMP 与顺序的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com