gpt4 book ai didi

c - C 中带有比较 SSE 的 If 语句

转载 作者:太空狗 更新时间:2023-10-29 17:23:47 25 4
gpt4 key购买 nike

我想实现这个:

for (int i=0;i<n,i++){
if (x[i] > 2.0f || x[i] < -2.0f)
a[i] += x[i];
}

我已经走了这么远,但不知道下一步该做什么:

__m128 P2f = _mm_set1_ps(2.0f);
__m128 M2f = _mm_set1_ps(-2.0f);
for(int i=0;i<n,i+=4){
__m128 xv = _mm_load_ps(x+i);
__m128 av = _mm_load_ps(a+i);

__m128 c1 = _mm_cmpgt_ps(xv, P2f);
__m128 c2 = _mm_cmplt_ps(xv, M2f);

__m128 or = _mm_or_ps(c1,c2);
=???==
av = _mm_add_ps(av, xv);
_mm_store_ps(a+i, av);
}

最佳答案

你很接近:

const __m128 P2f = _mm_set1_ps(2.0f);
const __m128 M2f = _mm_set1_ps(-2.0f);
for (int i = 0; i < n; i += 4)
{
__m128 xv = _mm_load_ps(x + i);
__m128 av = _mm_load_ps(a + i);

__m128 c1v = _mm_cmpgt_ps(xv, P2f);
__m128 c2v = _mm_cmplt_ps(xv, M2f);

__m128 cv = _mm_or_ps(c1v, c2v);

xv = _mm_and_ps(xv, cv);

av = _mm_add_ps(av, xv);

_mm_store_ps(a + i, av);
}

诀窍是对两个比较结果进行OR,然后使用此组合结果作为掩码,使用按位AND 将未通过测试的X 值清零> 操作。然后添加掩码 X vector ,这将根据掩码将 0 或原始 X 值添加到 A 的每个元素。


对于下面评论中提到的替代版本,您可以这样做:

const __m128 P2f = _mm_set1_ps(2.0f);
const __m128 M2f = _mm_set1_ps(-2.0f);
for (int i = 0; i < n; i += 4)
{
__m128 xv = _mm_load_ps(x + i);
__m128 av = _mm_load_ps(a + i);

__m128 c1v = _mm_cmpgt_ps(xv, P2f);
__m128 c2v = _mm_cmplt_ps(xv, M2f);

__m128 cv = _mm_or_ps(c1v, c2v);

xv = _mm_and_ps(P2f, cv); // <<< change this line to get a[i] += 2.0f
// instead of a[i] += x[i]

av = _mm_add_ps(av, xv);

_mm_store_ps(a + i, av);
}

对于您在后面的评论中提到的第三个版本 (a[i] *= 2.0),它稍微有点棘手,但您可以通过将表达式视为 a[i ] += a[i]:

const __m128 P2f = _mm_set1_ps(2.0f);
const __m128 M2f = _mm_set1_ps(-2.0f);
for (int i = 0; i < n; i += 4)
{
__m128 xv = _mm_load_ps(x + i);
__m128 av = _mm_load_ps(a + i);

__m128 c1v = _mm_cmpgt_ps(xv, P2f);
__m128 c2v = _mm_cmplt_ps(xv, M2f);

__m128 cv = _mm_or_ps(c1v, c2v);

xv = _mm_and_ps(av, cv)); // <<< change this line to get a[i] *= 2.0f (a[i] += a[i])
// instead of a[i] += x[i]

av = _mm_add_ps(av, xv);

_mm_store_ps(a + i, av);
}

关于c - C 中带有比较 SSE 的 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15372885/

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