看起來你可以利用這樣一個事實,即所有1的位模式都是單精度和雙精度的NaN
,並且在所有情況下,所有0的位模式都是0.0。所以,收拾你的兩個雙面膜載體,以單精度浮點矢量,你可以這樣做:
__m256 v = _mm256_set_m128(_mm256_cvtpd_ps(v0), _mm256_cvtpd_ps(v1));
需要注意的是,如果你沒有_mm256_set_m128
做,那麼你可以將它定義爲:
#define _mm256_set_m128(va, vb) \
_mm256_insertf128_ps(_mm256_castps128_ps256(vb), va, 1)
這裏有一個演示:
#include <stdio.h>
#include <immintrin.h>
#define _mm256_set_m128(va, vb) \
_mm256_insertf128_ps(_mm256_castps128_ps256(vb), va, 1)
static void printvd(const char * label, __m256d v)
{
int64_t a[4];
_mm256_storeu_pd((double *)a, v);
printf("%s = %lld %lld %lld %lld\n", label, a[0], a[1], a[2], a[3]);
}
static void printvf(const char * label, __m256 v)
{
int32_t a[8];
_mm256_storeu_ps((float *)a, v);
printf("%s = %d %d %d %d %d %d %d %d\n", label, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
int main()
{
__m256d v0 = _mm256_set_pd(0.0, 1.0, 2.0, 3.0);
__m256d v1 = _mm256_set_pd(3.0, 2.0, 1.0, 0.0);
__m256d vcmp0 = _mm256_cmp_pd(v0, v1, 1);
__m256d vcmp1 = _mm256_cmp_pd(v1, v0, 1);
__m256 vcmp = _mm256_set_m128(_mm256_cvtpd_ps(vcmp0), _mm256_cvtpd_ps(vcmp1));
printvd("vcmp0", vcmp0);
printvd("vcmp1", vcmp1);
printvf("vcmp ", vcmp);
return 0;
}
測試:
$ gcc -Wall -mavx so_avx_test.c && ./a.out
vcmp0 = 0 0 -1 -1
vcmp1 = -1 -1 0 0
vcmp = -1 -1 0 0 0 0 -1 -1
我假設您打算使用_mm_cmp_pd來代替__mm_cmp_pd。但_mm_cmp_pd返回__m128d。 – ScottD