我是否最有效地使用 SSE 资源
Am I using the SSE resources most efficiently?
我有这段代码来查找键在低/高范围内有多少像素。低-高矩阵由输入大矩阵生成。我必须输出匹配像素数大于 150(的 256(的低/高坐标。
int8_t high[8192][8192];
int8_t low[8192][8192];
int8_t key[16][16]
for (int i = 0; i <= 8192 - 16; i++)
for (int j = 0; j <= 8192 - 16; j++)
{
char *kLoc = key[ii];
char *lLoc = low[i + ii] + j;
char *hLoc = high[i + ii] + j;
__m128i high, low, num;
low = _mm_loadu_si128((__m128i*)lLoc);
high = _mm_loadu_si128((__m128i*)hLoc);
num = _mm_loadu_si128((__m128i*)kLoc);
// Snip
}
这能做得更好吗?
我知道有 8 个 128 位 XMM 寄存器和 MMX 寄存器,而我只使用 3 个可用的 XMM 寄存器。我可以优化代码以利用所有寄存器吗?
在
优化方面,不要猜测、测量和测量目标/生产环境。对于简单的算术,瓶颈通常在于内存带宽,因此您可以考虑在加载和保存之间执行其他操作。您还可以通过将循环重新排序和交错到:
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++(,如上所述,一些编译器如此愚蠢并生成计算每个循环中地址的代码。
相关文章:
- 具有瞬态资源的RAII类
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 如何跨平台将二进制资源构建到程序中?
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- C++链接时间资源"allocation"而不定义
- C++ SSE 内部函数:将结果存储在变量中
- 使用 Bazel 生成 QT 资源文件
- 编译器资源管理器和 GCC 具有不同的输出
- 使用 Bazel 编译 QT 应用程序时访问资源
- 根据需要声明资源,而不重复它们
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- 我是否最有效地使用 SSE 资源