如何使用 SIMD 比较两个向量并获得单个布尔结果?

发布于 2024-11-27 08:53:45 字数 159 浏览 2 评论 0原文

我有两个分别包含 4 个整数的向量,我想使用 SIMD 命令来比较它们(假设根据比较结果生成一个结果向量,其中每个条目为 0 或 1)。

然后,我想将结果向量与 4 个零的向量进行比较,只有当它们相等时才执行某些操作。

你知道我可以使用哪些 SIMD 命令来做到这一点吗?

I have two vectors of 4 integers each and I'd like to use a SIMD command to compare them (say generate a result vector where each entry is 0 or 1 according to the result of the comparison).

Then, I'd like to compare the result vector to a vector of 4 zeros and only if they're equal do something.

Do you know what SIMD commands I can use to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

偏爱你一生 2024-12-04 08:53:45

要比较两个 SIMD 向量:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };
int32_t __attribute__ ((aligned(16))) result[4];

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
_mm_store_si128((__m128i *)result, vcmp);

注意:

  • 假设数据为 32 位整数
  • vector1vector2result 均需要为 16 字节对齐
  • 结果-1 表示相等,0 表示不等于(上面的代码示例为 { -1, -1, 0, 0 }

UPDATE

如果您只想要一个布尔值情况的结果所有 4 个元素都匹配,那么你可以这样做:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
uint16_t mask = _mm_movemask_epi8(vcmp);
int result = (mask == 0xffff);

To compare two SIMD vectors:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };
int32_t __attribute__ ((aligned(16))) result[4];

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
_mm_store_si128((__m128i *)result, vcmp);

Notes:

  • data is assumed to be 32 bit integers
  • vector1, vector2, result all need to be 16 byte aligned
  • result will be -1 for equal, 0 for not equal ({ -1, -1, 0, 0 } for above code example)

UPDATE

If you just want a single Boolean result for the case where all 4 elements match then you can do it like this:

#include <stdint.h>
#include <xmmintrin.h>

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 };
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 };

__m128i v1 = _mm_load_si128((__m128i *)vector1);
__m128i v2 = _mm_load_si128((__m128i *)vector2);
__m128i vcmp = _mm_cmpeq_epi32(v1, v2);
uint16_t mask = _mm_movemask_epi8(vcmp);
int result = (mask == 0xffff);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文