问题一:
比如将一个长数组中元素按照一种方式累加到一个短数组中去:
int longArray[M];
int shortArray[N];// N << M
for(int i = 0; i < M; i++)
{
pos = getpos(longArray[i]);
shortArray[pos] += longArray[i];
}
这样就会出现关于shortArray读写的loop carry dependency问题,请问有什么方法可以消除么?
问题二:
优化循环后实际的运算速度有些情况与ii * trip_cnt相同,而有些时候就会有很大的差别。比如上面的例子改成:
int longArray[M];
int shortArray1[N];
int shortArray2[N];// N << M
for(int i = 0; i < M; i++)
{
pos1 = getpos(longArray[i * 2]);
shortArray1[pos1] += longArray[i * 2];
pos2 = getpos(longArray[i * 2 + 1]);
shortArray2[pos1] += longArray[i * 2+ 1];
}
由于loop carry dependency的问题没有解决随意前后两个循环编译器给出的ii是相同的的,
但是实际运行上,在使用我的getpos的情况下第二个循环的运行时间还是会多出很多。
请问对于这样的情况我该如何确定并解决呢?
感谢!