Как можно использовать SIMD векторизацию для создания массива битов знаковых чисел из массива чисел с плавающей запятой?

Как я могу преобразовать массив чисел типа `float` в его битовое представление или хотя бы в байтное представление в четыре раза меньшего размера с использованием `Vector<float>`? Можно ли выполнить преобразование таким образом, чтобы получить битовое представление или байтное представление массива чисел меньшего размера, к примеру, из 256 битовых чисел в 1 байт или в 8 байтов?
  • 29 декабря 2023 г. 19:57
Ответы на вопрос 2
Для создания массива битов знаковых чисел из массива чисел с плавающей запятой, можно использовать SIMD инструкции. Однако, не все архитектуры SIMD поддерживают непосредственное преобразование `float` в биты, поэтому рекомендуется использовать промежуточное преобразование в `int`.

Для преобразования массива чисел типа `float` в его битовое представление, можно воспользоваться следующим кодом на языке C#:

```csharp
float[] floatArray = /* Исходный массив чисел с плавающей запятой */;
byte[] byteArray = new byte[floatArray.Length * 4]; // Байтовое представление будет в 4 раза меньше по размеру

Vector<float> vector = new Vector<float>(); // Создаем SIMD вектор для работы с числами типа float
Vector<byte> byteVector = new Vector<byte>(); // SIMD вектор для работы с числами типа byte

for (int i = 0; i < floatArray.Length; i += Vector<float>.Count)
{
    vector = new Vector<float>(floatArray, i);

    // Преобразуем числа типа float в числа типа int (с учетом конвертации значений и байтового порядка)
    Vector<int> intVector = Vector.AsVectorInt32(vector);

    // Преобразуем числа типа int в числа типа byte (с учетом конвертации значений и байтового порядка)
    byteVector = Vector.AsVectorByte(intVector);

    byteVector.CopyTo(byteArray, i * 4);
}
```

В результате данного кода, переменная `byteArray` будет содержать битовое представление массива чисел типа `float`, преобразованное в массив байтов. Каждое число из исходного массива `floatArray` будет занимать 4 байта в `byteArray`.

Если вам необходимо преобразовать массив чисел в размере 256 бит (т.е., например, 8 чисел `float`), в массив размером 1 байт или 8 байтов, то вы можете использовать соответствующие типы SIMD векторов и размерности в коде выше. Размерность SIMD вектора `Vector<byte>` будет соответствовать ожидаемому размеру результирующего байтового массива.
SergeySerge11 , а какая размерность вектора? если мегабайты, то может и имеет смысл. но если в предела 8, 16, 32 бит - из пушки по воробьям! 
мало того SIMD зависит от железа, а байткод нет
Похожие вопросы