我正在使用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) 我试图将两个向量相乘,其中一个向量的每个元素乘以另一个向量的相同索引中的元素.然后,我想要对结果向量的所有元素求和,以获得一个数字.例如,对于矢量{1,2,3,4}和{5,6,7,8},计算结果如下:
1*5 + 2*6 + 3*7 + 4*8
基本上,我正在采用两个向量的点积.我知道有一个SSE命令来执行此操作,但该命令没有与之关联的内部函数.此时,我不想在我的C代码中编写内联汇编,所以我只想使用内部函数.这似乎是一个常见的计算,所以我很惊讶自己在Google上找不到答案.
注意:我正在针对特定的微架构进行优化,该架构最多支持SSE 4.2.
谢谢你的帮助.
给定正则表达式,我想生成正则表达式匹配的字符串集.重要的是要注意,这个集合不会是无限的,因为每个字符串都有最大长度.是否有任何众所周知的算法来执行此操作?我是否有任何研究论文可以阅读以深入了解这个问题?
谢谢.
ps在理论cs堆栈交换中,这类问题会更合适吗?
我知道它会接受文件名中的'*',但标准的正则表达式运算符如'.' 或字符类不起作用.我认为这将是我在网上很容易找到的东西,但经过大约15分钟的搜索,我找不到我的问题的答案让我感到沮丧.
c ×2
regex ×2
simd ×2
sse ×2
algorithm ×1
dot-product ×1
emacs ×1
intrinsics ×1
optimization ×1
production ×1
string ×1