Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否最有效地使用SSE资源?_C++_Optimization_Sse - Fatal编程技术网

C++ 我是否最有效地使用SSE资源?

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_

我有这段代码来找出关键点的多少像素位于低/高范围。 低-高矩阵由输入大矩阵生成。我必须输出低/高坐标,其中匹配像素数大于150(256)

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