gpt4 book ai didi

使用 AVX 内在函数压缩掩码

转载 作者:太空狗 更新时间:2023-10-29 15:00:34 25 4
gpt4 key购买 nike

我想将两个 256 位 vector (__m256d) 合并为一个 256位 vector ,通过省略每个 64 位 double 的上半部分。

所以,如果在下面,a_i, b_i, ... 是 32 位字,并且我有两个具有以下结构的 256 位(4 x double ) vector :

a_0、a_0、b_0、b_0、c_0、c_0、d_0、d_0a_1、a_1、b_1、b_1、c_1、c_1、d_1、d_1

我想要一个具有以下结构的 256 位 vector :

a_0、b_0、c_0、d_0、a_1、b_1、c_1、d_1

我如何使用英特尔内在函数有效地做到这一点?可用的指令集是 AVX 的一切。

最佳答案

看起来您可以利用以下事实:全 1 的位模式在单精度和 double 中都是 NaN,类似地,全 0 的位模式在这两种情况下都是 0.0。因此,要将两个双掩码 vector 打包到一个浮点 vector 中,您可以这样做:

 __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

关于使用 AVX 内在函数压缩掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829290/

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