是否可以并行化或展开此循环?

时间:2018-07-06 20:43:09

标签: multithreading performance for-loop parallel-processing

我试图查看我是否可以提高C ++中以下循环的性能,该循环使用二维向量(_external和_Table),并且对先前的迭代具有循环依赖。此外,它在最内层的循环中具有一个经过计算的索引访问器,这将使_Table的访问在右侧不连续。

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);
        }
    }
}

如何改善这样的循环性能?

1 个答案:

答案 0 :(得分:1)

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

datetime

执行对正确性至关重要。 (也就是说,如果i,j,k的迭代顺序发生变化,则结果将有所不同……而且不正确。)

因此,我认为您仅需进行微优化,例如将表达式$casts int index = _external.at(j).at(k); _Table.at(j).at(i) += _Table.at(index).at(i-1); 提升到最内层循环。

考虑一下:

_Table.at(j).at(i)

此循环将数字重复添加到_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); } 必须从表的另一个单元格读取(由于_Table.at(j).at(i)_Table.at(index).at(i-1)的原因),您可以执行以下操作:

i-1

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