【发布时间】:2013-03-11 21:39:27
【问题描述】:
使用库“immintrin.h”,我可以为简单的 for 循环和操作编写 SSE 指令。但是,如何为显示的语句编写 SSE 指令?
for (int i =0; i<n; i++){
for (int j=0; j<n; j++) {
x[i] += a[i] + a[j];
}}
x 和 a 是使用 _mm_malloc() 初始化的 float*。内存访问模式可用作 __m128 和 4 字节的展开策略。
对不起,如果我不太清楚,但就像
for (int i = 0; i < vecsize; i+=4) {
__m128 a = _mm_load_ps(a+i);
__m128 x = _mm_add_ps(x,a);
_mm_store_ps(x+i, x);
}
(仅适用于 1 个循环),我想要上面显示的循环类似的东西。
编辑:我(EricPostpischil)正在从评论中注入此文本,因为它对问题陈述重要。作者 NeilDA 应该对此进行扩展:
...在我的程序中,'a' 总是在变化,因此我希望 'x' 随之变化。
我已经做到了!我提交了答案..
【问题讨论】:
-
您还没有告诉我们
x和a是什么类型。您是否已经知道要如何运行循环?你想要什么样的内存访问模式。 -
x 和 a 是使用 _mm_malloc() 初始化的 float*。使用_m128?如果这有意义吗?抱歉,我是新手。
-
谢谢。但请不要在评论中添加。对问题进行编辑。我们不想为了理解这个问题而阅读 cmets。而且任何关于矢量化策略的想法都会有所帮助。如果你没有,请说出来。如果您已经决定了策略,但无法实施,请说出来。对 Q 是什么产生巨大影响。
-
好的,我将在主要问题中编辑上一个和这个。以向量大小 (N/4)*4 展开的策略?
-
“普通 C”是什么意思?您无法将 SSE 与普通 C 进行比较。这没有任何意义。 C是一种高级语言。 SSE 是一个 ISA。您的编译器可以将您的 C 编译为 SSE 指令。它可能已经这样做了,或者可以通过适当的编译器选项轻松地这样做。
标签: c for-loop sse vectorization