4

我正在尝试使用 SSE2 优化功能。我想知道我是否可以比这种方式更好地为我的汇编代码准备数据。我的源数据是一堆来自 pSrcData 的无符号字符。我将它复制到这个浮点数组中,因为我的计算需要在浮点数中进行。


unsigned char *pSrcData = GetSourceDataPointer();

__declspec(align(16)) float vVectX[4];

vVectX[0] = (float)pSrcData[0];
vVectX[1] = (float)pSrcData[2];
vVectX[2] = (float)pSrcData[4];
vVectX[3] = (float)pSrcData[6];

__asm 
{
     movaps xmm0, [vVectX]
     [...]  // do some floating point calculations on float vectors using addps, mulps, etc
}

我有没有更快的方法将 pSrcData 的每个其他字节转换为浮点数并将其存储到 vVectX 中?

谢谢!

4

2 回答 2

5

(1) 与掩码将奇数字节归零 ( PAND)

(2) 从 16 位解包到 32 位(PUNPCKLWD带零向量)

(3) 将 32 位整数转换为浮点数 ( CVTDQ2PS)

三个指令。

于 2010-10-21T21:54:44.263 回答
2

我意识到超级老线程,但我自己正在寻找代码来做到这一点。这是我的解决方案,我认为它更简单:

#include <immintrin.h>
#include <stdint.h>

#ifdef __AVX__
// Modified from http://stackoverflow.com/questions/16031149/speedup-a-short-to-float-cast
// Convert unsigned 8 bit integer to  float. Length must be multiple of 8
int  avxu8tof32(uint8_t *src, float *dest, int length) {
  int i;

  for (i=0; i<length; i+= 8) {

    //  Load 8 8-bit int into the low half of a 128 register
    __m128i v = _mm_loadl_epi64 ((__m128i const*)(src+i));

    //  Convert to 32-bit integers
    __m256i v32 = _mm256_cvtepu8_epi32(v);

    //  Convert to float
    __m256 vf = _mm256_cvtepi32_ps (v32);

    //  Store
    _mm256_store_ps(dest + i,vf);
  }
  return(0);
}
#endif

However benchmarking shows it no faster than just looping over the array in C, with compiler optimisation enabled. Maybe the approach will be more useful as the initial stage of a bunch of AVX computations.

于 2017-09-21T05:40:39.113 回答