我在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/