C++ 我是否最有效地使用SSE资源?
我有这段代码来找出关键点的多少像素位于低/高范围。 低-高矩阵由输入大矩阵生成。我必须输出低/高坐标,其中匹配像素数大于150(256)C++ 我是否最有效地使用SSE资源?,c++,optimization,sse,C++,Optimization,Sse,我有这段代码来找出关键点的多少像素位于低/高范围。 低-高矩阵由输入大矩阵生成。我必须输出低/高坐标,其中匹配像素数大于150(256) int8_t high[8192][8192]; 国际贸易低潮[8192][8192]; 国际8_t键[16][16] 对于(iTi=0;i当达到优化时,不要对目标/生产环境进行猜测、测量和测量。对于简单的算法,瓶颈通常是在内存带宽上,因此您可以考虑在加载和保存之间做其他事情。也可以通过重新排序和交织来减少到一个比较而不是2个比较+合并结果。循环到: num_
int8_t high[8192][8192];
国际贸易低潮[8192][8192];
国际8_t键[16][16]
对于(iTi=0;i当达到优化时,不要对目标/生产环境进行猜测、测量和测量。对于简单的算法,瓶颈通常是在内存带宽上,因此您可以考虑在加载和保存之间做其他事情。也可以通过重新排序和交织来减少到一个比较而不是2个比较+合并结果。循环到:
num_1 = loadu(hLoc); hLoc++;
num_2 = loadu(hLoc); hLoc++;
low_1 = loadu(kLoc); kLoc++;
low_2 = loadu(kLoc); kLoc++;
high_1 = loadu(lLoc); lLoc++;
high_2 = loadu(lLoc); lLoc++;
num1 = mm_sub(low1)
num2 = mm_sub(low2)
cmp num1, high1
cmp num2, high2
store num1
store num2
您可能还希望将kLoc、lLoc、hLoc移到循环之外,并执行增量(即kLoc++)如上所述,有些编译器非常愚蠢,生成的代码可以计算每个循环中的地址。您可以轻松展开循环以执行多个SSE寄存器输出,这样您就可以使用更多寄存器,但大多数情况下,这并不重要。也许您可以发布更多代码,以显示您在这里真正做了什么。(请注意,对齐阵列可能会导致速度加快,因为这样您就可以使用对齐的加载。)@Christopher问题是,如果我使用未对齐的加载,我一次处理16字节(16X),而如果使用16位对齐,则一次处理16字节(8X)。我认为这可能是错误的。字节对齐。而不是位对齐。因此,如果使用\u declspec(align(16))int8_t key[16][16];
,您可以使用“加载”si128(kLoc)进行加载,这可以提高速度。@Christopher我正在使用“加载”属性(…)用于对齐和使用_mm_load_si128,但随后_mm_cmpgt
会因崩溃的Post代码而失败。_mm_cmpgt在您给它寄存器时不会崩溃。您可以给它一个地址,然后它会用对齐的加载该地址(当您传递未对齐的地址时,它会崩溃)
num_1 = loadu(hLoc); hLoc++;
num_2 = loadu(hLoc); hLoc++;
low_1 = loadu(kLoc); kLoc++;
low_2 = loadu(kLoc); kLoc++;
high_1 = loadu(lLoc); lLoc++;
high_2 = loadu(lLoc); lLoc++;
num1 = mm_sub(low1)
num2 = mm_sub(low2)
cmp num1, high1
cmp num2, high2
store num1
store num2