AVX2 потребляет байты при производстве единиц?C#

Место общения программистов C#
Ответить
Anonymous
 AVX2 потребляет байты при производстве единиц?

Сообщение Anonymous »

Потихоньку изучаю SIMD, но все еще есть некоторые аспекты, которые я не могу уяснить, пытаясь найти SIMD-решение проблемы. Один из них — когда входной сигнал меньше выходного.
В качестве примера предположим, что у меня есть 8-битное изображение в оттенках серого. то есть каждый пиксель представляет собой байт в диапазоне 0-255. И теперь я хочу преобразовать это в предварительно умноженное альфа-изображение с указанным цветом. Таким образом, входные данные представляют собой 8-битный массив (8 бит на пиксель), а выходные данные — 32-битный массив (32 бита на пиксель RGBA_8888).
Таким образом, массивы не являются один к одному. Один байт в массиве оттенков серого будет преобразован в 4 байта в массиве цветов.
В скалярной форме это будет выглядеть так:

Код: Выделить всё

 public class Test
{
const int ImageSize = 2048;
const int ImageLength = ImageSize * ImageSize;
private byte[] _bytesGray = new byte[ImageLength];
private uint[] _pixelsRGBA = new uint[ImageLength];

private const byte _colorR = 0xFF;
private const byte _colorG = 0x01;
private const byte _colorB = 0x02;
private const byte _colorA = 0xFF;

[GlobalSetup]
public void Setup()
{
for (int i = 0; i < ImageLength; i++)
{
_bytesGray[i] = (byte)(i + 1);
_pixelsRGBA[i] = 0;
}
}

[Benchmark]
public unsafe void GrayscaleToColor_Scalar()
{
fixed (byte* bytePtr = _bytesGray)
fixed (uint* pixelPtr = _pixelsRGBA)
{
for (int i = 0; i < ImageLength; ++i)
{
byte value = bytePtr[i];
byte r = (byte)((value * _colorR) >> 8);
byte g = (byte)((value * _colorG) >> 8);
byte b = (byte)((value * _colorB) >> 8);
byte a = (byte)((value * _colorA) >> 8);

pixelPtr[i] = (uint)(r 

Подробнее здесь: [url]https://stackoverflow.com/questions/78746532/avx2-consuming-bytes-whilst-producing-uints[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»