我在SSE / C++中遇到一种“特殊的”条件结构麻烦。以下伪代码说明了我要执行的操作:

    for-loop ...
        // some SSE calculations
        __m128i a = ... // a contains four 32-bit ints
        __m128i b = ... // b contains four 32-bit ints

        if any of the four ints in a is less than its corresponding int in b
            vector.push_back(e.g. first component of a)

因此,我进行了许多SSE计算,并且作为这些计算的结果,我有两个__m128i值,每个值包含四个32位整数。这部分工作正常。但是现在,如果a中的四个int至少有一个小于b中的相应int,那么我现在想将某些内容推入 vector 。我不知道如何实现这一目标。

我知道_mm_cmplt_epi32函数,但是到目前为止,我未能使用它来解决我的特定问题。

编辑:

是的,实际上我正在寻找一个聪明的解决方案。我有一个解决方案,但这看起来非常非常奇怪。
for-loop ...
    // some SSE calculations
    __m128i a = ... // a contains four 32-bit ints
    __m128i b = ... // b contains four 32-bit ints

    long long i[2] __attribute__((aligned (16)));

    __m128i cmp = _mm_cmplt_epi32(a, b);
    _mm_store_si128(reinterpret_cast<__m128i*>(i), cmp);

       if(i[0] || i[1]) {
            vector.push_back(...)

我希望有更好的方法...

最佳答案

您想使用_mm_movemask_ps函数,该函数将返回一个可以测试的适当位掩码:

cmp = _mm_cmplt_epi32(a, b);

if(_mm_movemask_ps(cmp))
{
    vector.push_back(...);
}

此处记录:http://msdn.microsoft.com/en-us/library/4490ys29%28v=vs.90%29.aspx

关于c++ - 上证所的条件结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20414630/

10-12 21:30