并行化循环嵌套的最外层循环通常更有益,因为发生的开销很小。然而,由于此类循环可能携带依赖性,并行化最外层循环并非始终安全。以下对此进行说明:
for (i=0; i <n; i++) { for (j=0; j <n; j++) { a[j][i+1] = 2.0*a[j][i-1]; } } |
在本例中,具有索引变量 i 的循环不能并行化,原因是循环的两次连续迭代之间存在依赖性。这两个循环可以交换,并行循环(j 循环)变为外部循环:
for (j=0; j<n; j++) { for (i=0; i<n; i++) { a[j][i+1] = 2.0*a[j][i-1]; } } |
交换后的循环只发生一次并行工作分配开销,而先前发生 n 次开销。编译器执行安全性和有益性分析,以确定是否执行循环交换。