C 有人能帮我优化这个循环吗?

C 有人能帮我优化这个循环吗?,c,performance,optimization,sse,C,Performance,Optimization,Sse,我有一个for循环,它会运行很多次,并且会花费很多时间: for (int z=0; z<temp; z++) { float findex= a + b * A[z]; int iindex = findex ; outArray[z] += inArray[iindex] + (findex - iindex) * (inArray[iindex+1] - inArray[iindex]); a++; } 用于(int z=0;z尝试在inaray和o

我有一个for循环,它会运行很多次,并且会花费很多时间:

for (int z=0; z<temp; z++)
{
    float findex= a + b * A[z];
    int iindex = findex ;
    outArray[z] += inArray[iindex] + (findex - iindex) * (inArray[iindex+1] - inArray[iindex]);
    a++;
}

用于(int z=0;z尝试在inaray和outArray上使用
restrict
关键字。否则编译器必须假设
inaray
可能是==
outArray
。在这种情况下,不可能进行并行化。

尝试在inaray和outArray上使用
restrict
关键字。否则编译器必须假设
inArray
可以==
outArray
。在这种情况下,不可能进行并行化。

当您写入
outArray[z]
时,您的循环具有循环携带的依赖项。您的CPU可以一次执行多个浮点和,但对于当前循环,您只允许一个
outArray[z]和
。要解决此问题,应展开循环

for (int z=0; z<temp; z+=2) {
    float findex_v1 = a + b * A[z];
    int iindex_v1 = findex_v1;  
    outArray[z] += inArray[iindex_v1] + (findex_v1 - iindex_v1) * (inArray[iindex_v1+1] - inArray[iindex_v1]);

    float findex_v2 = (a+1) + b * A[z+1];
    int iindex_v2 = findex_v2;
    outArray[z+1] += inArray[iindex_v2] + (findex_v2 - iindex_v2) * (inArray[iindex_v2+1] - inArray[iindex_v2]);
    a+=2;
}

当您写入
outArray[z]
时,您的循环有一个循环携带的依赖项。您的CPU可以一次执行多个浮点和,但对于当前循环,您只允许一个
outArray[z]
的和。要解决此问题,您应该展开循环

for (int z=0; z<temp; z+=2) {
    float findex_v1 = a + b * A[z];
    int iindex_v1 = findex_v1;  
    outArray[z] += inArray[iindex_v1] + (findex_v1 - iindex_v1) * (inArray[iindex_v1+1] - inArray[iindex_v1]);

    float findex_v2 = (a+1) + b * A[z+1];
    int iindex_v2 = findex_v2;
    outArray[z+1] += inArray[iindex_v2] + (findex_v2 - iindex_v2) * (inArray[iindex_v2+1] - inArray[iindex_v2]);
    a+=2;
}

你能告诉我们它做什么吗?什么是A?你检查过汇编输出了吗?把
z++
改成
++z
通常是个好主意too@user2485710:为什么这会有什么不同?我不确定我在这里看到了多少矢量化的机会;一般来说,你没有处理连续内存。你是对的,所以我我想我必须用“\u mm\u set\u ps”多次生成uuu m128数据您能告诉我们它的功能吗?A是什么?您是否检查了程序集输出?将
z++
更改为
++z
通常是个好主意too@user2485710:为什么这会有什么不同?我不确定我在这里看到了多少矢量化机会;您没有处理连续的内存ory,总的来说,你是对的,所以我想我必须用“\u mm\u set\u ps”多次生成_m128 dataHi,谢谢你的回复!我在for循环外使用了多线程,因此我认为没有必要使用并行化。原始程序有点复杂,所以我简化了for循环。我想使用simd优化循环。可能会有性能改进,使用sse!使用“restrict”关键字将帮助编译器消除inArray和outArray的歧义,从而自动或半自动地对循环进行向量化(我猜Kay的意思是指令级并行化,即向量化)。但1.消除歧义不足以有效地对循环进行矢量化。正如下面提到的其他内容,您还必须2.解决交叉迭代依赖关系,3.考虑单位跨距(连续)内存访问。完成后,编译器应该能够自动矢量化(对于英特尔编译器,您也可以尝试使用#pragma simd或#pragma ivdep)您好,谢谢您的回复!我在for循环之外使用了多线程,所以我认为没有必要使用并行化。原始程序有点复杂,所以我简化了for循环。我想使用simd来优化循环。可能会有性能改进,使用sse!使用“restrict”关键字将帮助编译器消除inArray和outArray的歧义,从而自动或半自动地对循环进行向量化(我猜Kay的意思是指令级并行化,即向量化)。但1.消除歧义不足以有效地对循环进行矢量化。正如下面提到的其他内容,您还必须2.解决交叉迭代依赖关系,3.考虑单位跨距(连续)内存访问。完成后,编译器应该能够自动矢量化(对于英特尔编译器,您也可以尝试使用#pragma simd或#pragma ivdep)