gpt4 book ai didi

c++ - 真正基础的 SSE

转载 作者:行者123 更新时间:2023-11-30 00:57:30 24 4
gpt4 key购买 nike

我有一个非常简单的程序,我正在努力提高性能。我知道有帮助的一种方法是利用 SSE3(因为我正在工作的机器支持此功能),但我完全不知道如何执行此操作。这是一个代码片段 (c++):

int sum1, sum2, sum3, sum4;
for (int i=0; i<length; i+=4) {
for (int j=0; j<length; j+=4) {
sum1 = sum1 + input->value[i][j];
sum2 = sum2 + input->value[i+1][j+1];
sum3 = sum3 + input->value[i+2][j+3];
sum4 = sum4 + input->value[i+3][j+4];
{
}

我已经阅读了一些相关内容,并理解了这个想法,但我完全不知道如何实现它。有人可以帮我吗?我认为这相当简单,尤其是对于我的简单程序而言,但有时入门是最困难的部分。

谢谢!

最佳答案

其实你的情况并没有那么简单。就目前而言,您的代码不是 可矢量化。 (至少不是没有显着的循环转换)

这样做的原因是您在内循环中也更改了索引 i。这打破了任何能够向量化 j 迭代的机会,因为内存位置不再相邻并且位于矩阵的不同行中。 (因为你似乎沿着对角线向下运行矩阵)

但是,我觉得您正在尝试对矩阵中的所有元素求和,而您实际上希望您的循环是这样的(而且您也有一些错别字):

int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
for (int i=0; i<length; i++) {
for (int j=0; j<length; j+=4) {
sum1 = sum1 + input->value[i][j];
sum2 = sum2 + input->value[i][j+1];
sum3 = sum3 + input->value[i][j+2];
sum4 = sum4 + input->value[i][j+3];
}
}

int total = sum1 + sum2 + sum3 + sum4;

如果这是您想要的,那么它是非常可矢量化的。在使用内部函数的 C/C++ 中,这可以仅使用 SSE2 如下完成:

__m128i sum = _mm_setzero_si128();
for (int i=0; i<length; i++) {
for (int j=0; j<length; j+=4) {
__m128i val = _mm_load_si128(&input->value[i][j]);
sum = _mm_add_epi32(sum,val);
}
}

请注意对齐限制将适用。通过进一步展开循环可以获得更多的加速。

关于c++ - 真正基础的 SSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7976147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com