Multithreading 是否可以并行化或展开此循环? 我试图看看是否能提高C++中下面循环的性能,它使用二维向量(外加和表),并对前一迭代具有循环依赖性。此外,它在最里面的循环中有一个计算索引访问器,它将使右侧的_表的访问不连续 int N = 8000; int M = 400 int P = 100; for(int i = 1; i <= N; i++){ for(int j = 0; j < M; j++){ for(int k =0; k < P; k++){ int index = _external.at(j).at(k); _Table.at(j).at(i) += _Table.at(index).at(i-1); } } } int N=8000; int M=400 int P=100; 对于(inti=1;i

Multithreading 是否可以并行化或展开此循环? 我试图看看是否能提高C++中下面循环的性能,它使用二维向量(外加和表),并对前一迭代具有循环依赖性。此外,它在最里面的循环中有一个计算索引访问器,它将使右侧的_表的访问不连续 int N = 8000; int M = 400 int P = 100; for(int i = 1; i <= N; i++){ for(int j = 0; j < M; j++){ for(int k =0; k < P; k++){ int index = _external.at(j).at(k); _Table.at(j).at(i) += _Table.at(index).at(i-1); } } } int N=8000; int M=400 int P=100; 对于(inti=1;i,multithreading,performance,for-loop,parallel-processing,Multithreading,Performance,For Loop,Parallel Processing,,在我看来,这些语句的顺序如下: int index = _external.at(j).at(k); _Table.at(j).at(i) += _Table.at(index).at(i-1); 执行是正确性的关键。(也就是说,如果i、j、k的迭代顺序改变,那么结果将不同……并且不正确。) 因此,我认为您只剩下微观优化,比如将表达式\u Table.at(j).at(I)和\u external.at(j)从最内部的循环中提升出来 考虑这一点: for(int k

,在我看来,这些语句的顺序如下:

    int index = _external.at(j).at(k);
    _Table.at(j).at(i) += _Table.at(index).at(i-1);
执行是正确性的关键。(也就是说,如果i、j、k的迭代顺序改变,那么结果将不同……并且不正确。)

因此,我认为您只剩下微观优化,比如将表达式
\u Table.at(j).at(I)
\u external.at(j)
从最内部的循环中提升出来

考虑这一点:

    for(int k =0; k < P; k++){
        int index = _external.at(j).at(k);
        _Table.at(j).at(i) += _Table.at(index).at(i-1);
    }

这将减少对处的
的调用次数,并可能会稍微提高缓存性能。

谢谢-是的,我已经尝试过提升该临时变量。它在执行时间上没有太大的差异。我刚刚发布了“原始”确保我没有遗漏某些内容的代码版本。我想我必须回到绘图板上,看看是否可以找到一种不同的方法来获得正确的算法结果,而不使用这种类型的循环。谢谢
    int temp = 0;
    for(int k =0; k < P; k++){
        int index = _external.at(j).at(k);
        temp += _Table.at(index).at(i-1);
    }
    _Table.at(j).at(i) += temp;