私は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;
}
}
}
プライベート行 (および列) 変数に依存する配列にのみ書き込みを行っており、行はピボットよりも大きいことが保証されているため、何も上書きしていないことはコンパイラーにとって明らかなはずです。
私はコンパイルしていて-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行目だけでも同じです。コンパイラにはどのような問題がありますか? 明らかに、いくつかのプラグマで何をすべきかを正確に伝えることができますが、コンパイラが単独で何を得ることができるかを理解したいと思います。