我在ICC(11.1;旧的,但对此无能为力)中玩了一点自动并行化,我想知道为什么编译器不能并行化内部循环以进行简单的高斯消除:
void makeTriangular(float **matrix, float *vector, int n) {
for (int pivot = 0; pivot < n - 1; pivot++) {
// swap row so that the row with the largest value is
// at pivot position for numerical stability
int swapPos = findPivot(matrix, pivot, n);
std::swap(matrix[pivot], matrix[swapPos]);
std::swap(vector[pivot], vector[swapPos]);
float pivotVal = matrix[pivot][pivot];
for (int row = pivot + 1; row < n; row++) { // line 72; should be parallelized
float tmp = matrix[row][pivot] / pivotVal;
for (int col = pivot + 1; col < n; col++) { // line 74
matrix[row][col] -= matrix[pivot][col] * tmp;
}
vector[row] -= vector[pivot] * tmp;
}
}
}
我们只写入依赖于私有行(和 col)变量的数组,并且行保证大于枢轴,所以编译器应该很明显我们没有覆盖任何东西。
我正在编译-O3 -fno-alias -parallel -par-report3
并获得很多依赖项 ala:assumed FLOW dependence between matrix line 75 and matrix line 73.
或者assumed ANTI dependence between matrix line 73 and matrix line 75.
仅第 75 行也是如此。编译器有什么问题?显然我可以准确地告诉它如何处理一些编译指示,但我想了解编译器可以单独获得什么。