相关疑难解决方法(0)

SSE内在函数:将32位浮点数转换为UNSIGNED 8位整数

使用SSE内在函数,我得到了一个四个32位浮点数的向量,它被钳位到0-255范围并四舍五入到最接近的整数.我现在想把这四个写成字节.

有一个内部函数_mm_cvtps_pi8会将32位转换为8位有符号整数,但问题是任何超过127的值都会被钳位到127.我找不到任何会压缩无符号8位值的指令.

我有一种直觉,我可能想要做的是移动指令的一些组合_mm_cvtps_pi16_mm_shuffle_pi8后面的操作,以获得我关心的四个字节到内存中.这是最好的方法吗?我将看看我是否可以弄清楚如何编码shuffle控制掩码.

更新:以下似乎完全符合我的要求.有没有更好的办法?

#include <tmmintrin.h>
#include <stdio.h>

unsigned char out[8];
unsigned char shuf[8] = { 0, 2, 4, 6, 128, 128, 128, 128 };
float ins[4] = {500, 0, 120, 240};

int main()
{
    __m128 x = _mm_load_ps(ins);    // Load the floats
    __m64 y = _mm_cvtps_pi16(x);    // Convert them to 16-bit ints
    __m64 sh = *(__m64*)shuf;       // Get the shuffle mask into a register
    y = _mm_shuffle_pi8(y, sh);     // Shuffle the …
Run Code Online (Sandbox Code Playgroud)

x86 sse mmx

5
推荐指数
2
解决办法
4621
查看次数

如何使用avx指令将float向量转换为short int?

基本上,我该如何使用AVX2内部函数编写等效的代码?我们在此假设result_in_float类型为__m256,而result类型为short int*short int[8]

for(i = 0; i < 8; i++)
    result[i] = (short int)result_in_float[i];
Run Code Online (Sandbox Code Playgroud)

我知道可以使用__m256i _mm256_cvtps_epi32(__m256 m1)内在函数将浮点数转换为32位整数,但不知道如何将这些32位整数进一步转换为16位整数。而且我不仅想要这样,而且还要将这些值(以16位整数的形式)存储到内存中,而我想全部使用矢量指令来完成。

在Internet上搜索时,我发现了一个名为的内在函数_mm256_mask_storeu_epi16,但我不确定这是否可以解决问题,因为我找不到使用它的示例。

c c++ gcc avx avx2

4
推荐指数
1
解决办法
1550
查看次数

SSE - AVX从double转换为char

我想将双精度值的向量转换为char.我必须制作两种不同的方法,一种用于SSE2,另一种用于AVX2.

我开始使用AVX2.

__m128i sub_proc(__m256d& in)
{
    __m256d _zero_pd = _mm256_setzero_pd();

    __m256d ih_pd = _mm256_unpackhi_pd(in,_zero_pd);
    __m256d il_pd = _mm256_unpacklo_pd(in,_zero_pd);

    __m128i ih_si = _mm256_cvtpd_epi32(ih_pd);
    __m128i il_si = _mm256_cvtpd_epi32(il_pd);

    ih_si = _mm_shuffle_epi32(ih_si,_MM_SHUFFLE(3,1,2,0));
    il_si = _mm_shuffle_epi32(il_si,_MM_SHUFFLE(3,1,2,0));

    ih_si = _mm_packs_epi32(_mm_unpacklo_epi32(il_si,ih_si),_mm_unpackhi_epi32(il_si,ih_si));

    return ih_si;
}

__m128i proc(__m256d& in1,__m256d& in2)
{
      __m256d _zero_pd = _mm_setzeros_pd();

      __m128i in1_si = sub_proc(in1);
      __m128i in2_si = sub_proc(in2);

      return _mm_packs_epi16(in1_si,in2_si);
}
int main()
{

double input[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};

char output[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

char check[8];    

double* ibeg = input;
char* obeg = output;

for(int …
Run Code Online (Sandbox Code Playgroud)

c++ simd avx sse2 avx2

1
推荐指数
1
解决办法
769
查看次数

标签 统计

avx ×2

avx2 ×2

c++ ×2

c ×1

gcc ×1

mmx ×1

simd ×1

sse ×1

sse2 ×1

x86 ×1