小编Sam*_*Sam的帖子

使用SSE内在函数将4个点产品存储到C中的连续数组中的最有效方法

我正在使用SSE内在函数为英特尔x86 Nehalem微架构优化一些代码.

我的程序的一部分计算4个点产品,并将每个结果添加到阵列的连续块中的先前值.进一步来说,

tmp0 = _mm_dp_ps(A_0m, B_0m, 0xF1);
tmp1 = _mm_dp_ps(A_1m, B_0m, 0xF2);
tmp2 = _mm_dp_ps(A_2m, B_0m, 0xF4);
tmp3 = _mm_dp_ps(A_3m, B_0m, 0xF8);

tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
tmp0 = _mm_add_ps(tmp0, C_0n);

_mm_storeu_ps(C_2, tmp0);
Run Code Online (Sandbox Code Playgroud)

请注意,我通过使用4个临时xmm寄存器来保存每个点积的结果.在每个xmm寄存器中,结果被放入相对于其他临时xmm寄存器的唯一32位,这样最终结果如下所示:

tmp0 = R0-零 - 零

tmp1 =零-R1-零

tmp2 =零 - 零 - 零

tmp3 =零 - 零 - R3

我将每个tmp变量中包含的值组合成一个xmm变量,并将它们与以下说明相加:

tmp0 = _mm_add_ps(tmp0, tmp1);
tmp0 = _mm_add_ps(tmp0, tmp2);
tmp0 = _mm_add_ps(tmp0, tmp3);
Run Code Online (Sandbox Code Playgroud)

最后,我将包含点积的所有4个结果的寄存器添加到数组的连续部分,以便数组的索引以点积递增,就像这样(C_0n是数组中当前要更新的4个值) ; C_2是指向这4个值的地址):

tmp0 = _mm_add_ps(tmp0, …
Run Code Online (Sandbox Code Playgroud)

c sse simd intrinsics dot-product

11
推荐指数
1
解决办法
3178
查看次数

如何使用C中的SSE内部函数计算矢量点积

我试图将两个向量相乘,其中一个向量的每个元素乘以另一个向量的相同索引中的元素.然后,我想要对结果向量的所有元素求和,以获得一个数字.例如,对于矢量{1,2,3,4}和{5,6,7,8},计算结果如下:

1*5 + 2*6 + 3*7 + 4*8

基本上,我正在采用两个向量的点积.我知道有一个SSE命令来执行此操作,但该命令没有与之关联的内部函数.此时,我不想在我的C代码中编写内联汇编,所以我只想使用内部函数.这似乎是一个常见的计算,所以我很惊讶自己在Google上找不到答案.

注意:我正在针对特定的微架构进行优化,该架构最多支持SSE 4.2.

谢谢你的帮助.

c optimization sse simd vectorization

10
推荐指数
2
解决办法
2万
查看次数

生成正则表达式的所有可能匹配项

给定正则表达式,我想生成正则表达式匹配的字符串集.重要的是要注意,这个集合不会是无限的,因为每个字符串都有最大长度.是否有任何众所周知的算法来执行此操作?我是否有任何研究论文可以阅读以深入了解这个问题?

谢谢.

ps在理论cs堆栈交换中,这类问题会更​​合适吗?

regex string algorithm production

6
推荐指数
1
解决办法
483
查看次数

在Emacs中接受cx cf(打开文件)的正则表达式是什么?

我知道它会接受文件名中的'*',但标准的正则表达式运算符如'.' 或字符类不起作用.我认为这将是我在网上很容易找到的东西,但经过大约15分钟的搜索,我找不到我的问题的答案让我感到沮丧.

regex emacs

4
推荐指数
1
解决办法
432
查看次数