gpt4 book ai didi

c++ - 将位解压缩为单精度 float 的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:20 25 4
gpt4 key购买 nike

这是特定于平台的问题。速度至关重要。将一个字节解包到一个由 8 个单精度 float 组成的数组中以便零映射到零和一映射到一的最快方法是什么?

我最终使用 8 位掩码和 7 位移位解压缩为 8 个 int32,然后使用 AVX 指令将 int32 转换为 float 。

我的平台是在支持 AVX(但没有 AVX2)的 CPU 上运行的 Windows 64 位。编译器:Visual Studio 2013。

谢谢。

最佳答案

预处理不是更快吗? 2^8 的可能性已经差不多了,不过话又说回来,把它分成两部分,它只有 2^4 = 16 个变量。

使数组包含 16 个“值”,其中每个值都是用 4 个具有正确值的 float 填充的数组。那么您的成本将仅为 2 *(将数据从预处理数组复制到新数组)。

我不太了解汇编,但两个拷贝应该比某些循环等更快。

unsigned char myByte; // input byte (pattern to create floats)
float preprocessingArrays[16][4] = {
{ 0.0f, 0.0f, 0.0f, 0.0f }, // 0000
// ...
{ 1.0f, 1.0f, 1.0f, 1.0f } // 1111
};

float result[8];
std::memcpy(&result[0], &preprocessingArrays[myByte >> 4][0], 16);
std::memcpy(&result[4], &preprocessingArrays[myByte & 15][0], 16);
// 16 = platform-specific -> floats should be 32bits -> 4bytes * 4 floats = 16

这是手写的,但是正如你所看到的,我的循环将包含两个 memcpy,一个位移和一个二进制 AND 操作(或者只有一个,但更大,memcpy,如果你想对 2^8 个值进行预处理).

对于仅 C(++) 代码,我认为这会击败循环等,但汇编代码可能更快,我不太确定。 也许您可以使用汇编程序执行memcpy 操作,一次读取整个 4 个 float ,然后在另一个调用中写入。AVX 似乎支持多达 16 个 256 位寄存器,所以可能只计算从哪个寄存器(16 个可能值)复制值到哪里,这会非常快。

也不要自己写那么多代码,只需要做一个简单的程序,为你打印预处理值,复制并粘贴到原始程序中:)

关于c++ - 将位解压缩为单精度 float 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006584/

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