C++ OpenMP for 循环竞争条件

时间:2021-05-05 05:02:30

标签: c++ parallel-processing openmp

我正在解决一个问题,我有 N 项和与此项相关的 M 约束。每个项目都有一个值和 M 参数。我正在使用 GetBound 函数来计算算法当前状态下的上限(满足每个约束的一组项目中的最大值)。我使用 for 循环来计算 M 不同的边界(对于每个约束),然后我的函数返回我找到的最低边界。我想使用 OpenMP 使 for 循环并行工作以节省一些时间,但由于某种原因它不起作用(算法的运行时间实际上不会改变)。我认为这是因为我在循环内部使用向量,但我不明白为什么会发生竞争条件,因为在每次循环迭代期间,我只编写由单个线程控制的向量元素。我什至没有改变向量值(编辑的评论:OP 改变了在循环外定义的 bounds 的值),我只是找到了计算边界所需的值。

pair<double, int> GetBound(
MultidimensionalKnapsack knapsack, vector<vector<int>> indices, set<Item> I, set<Item> E) {
int n = knapsack.getN();
int m = knapsack.getM();
vector<Item> items = knapsack.getItems();
vector<int> b = knapsack.getB();
vector<pair<double, int>> bounds(m);
     #pragma omp parallel for num_threads(2)
for (int i = 0; i < m; i++)
{
    int index = -1;
    double weight = 0;
    vector<double> seq(n);
    for (int j = 0; j < n; j++)
    {
        if (I.count(items[j]) == 1) {
            weight += items[j].getConstraights()[i];
            seq[j] = 1;
        }
    }

    for (int j = 0; j < n; j++)
    {
        if ((I.count(items[indices[i][j]]) == 0) && (E.count(items[indices[i][j]]) == 0)) {
            if (weight + items[indices[i][j]].getConstraights()[i] <= b[i]) {
                weight += items[indices[i][j]].getConstraights()[i];
                seq[indices[i][j]] = 1;
            }
            else {
                seq[indices[i][j]] = (b[i] - weight) / items[indices[i][j]].getConstraights()[i];
                weight = b[i];
                index = indices[i][j];
            }
        }
    }
    int boundSum = 0;
    for (int j = 0; j < n; j++)
    {
        boundSum += seq[j] * items[j].getValue();
    }
    bounds[i].first = boundSum;
    bounds[i].second = index;
}

double min = bounds[0].first;
int minIndex = -1;
for (auto bound : bounds)
{
    if (bound.first < min) {
        min = bound.first;
        minIndex = bound.second;
    }
}
return make_pair(min, minIndex);
}

我在循环结束时将值写入全局向量变量中,但问题似乎隐藏在另一个嵌套循环(最大的循环)中。

0 个答案:

没有答案
相关问题