Хороший алгоритм сжатия без потерь для небольшого количества данных?

Я ищу хороший алгоритм сжатия без потерь, который может очень быстро сжимать / распаковывать небольшие объемы данных, например 256 чисел с плавающей запятой, которые находятся в диапазоне от 0 до 1. Я знаю RLE, но, возможно, есть что-то получше.

Фон состоит в том, что я работаю с объемными данными (например, 384 ³ с плавающей запятой) с помощью CUDA, и вместо того, чтобы явно сохранять объем, я хочу разделить его на блоки размером 8x8x4 и сохранить сжатые блоки. Ядра CUDA (каждый блок, состоящий из потоков 8x8x4) распаковывают соответствующий блок, работают с ним и снова сжимают.

Благодарю за любые предложения!


person yon    schedule 11.02.2014    source источник
comment
384 ^ 3 float - это всего лишь около 226 МБ данных. Зачем сжимать такой небольшой набор данных?   -  person talonmies    schedule 11.02.2014
comment
Чтобы уменьшить количество обращений к глобальной памяти, в идеале я хотел бы работать с чем-то вроде 1024³. Кроме того, в некоторых случаях на воксел фактически приходится 5-6 флотов, так что уже на 384³ это будет около ~ 1 ГБ данных.   -  person yon    schedule 11.02.2014
comment
Cuda также поддерживает 16-битные значения с плавающей запятой, если вы можете упаковать половину числа с плавающей запятой в 32-битный тип, вы можете получить эффективное удвоение памяти повсюду с гораздо меньшими вычислительными затратами, чем при использовании схемы сжатия без потерь.   -  person talonmies    schedule 11.02.2014


Ответы (2)


Хороший алгоритм без потерь зависит от типа имеющихся float величин. Для float от 0 до 1 у вас может быть почти такое же подзначение экспоненты. Вы знаете, что float - это знак, мантисса и показатель степени. Если все они> 0, знак всегда один и тот же, не сохраняйте его.

Совместная упаковка экспонатов может быть хорошей; таким образом, вы должны хранить мантиссы только после.

person Fvirtman    schedule 11.02.2014

Возможно, вы сможете отсортировать числа, а затем сохранить их как позицию и разницу. Вы можете упаковать их в любое количество битов. Разницу можно закодировать в виде дроби, где вы храните только знаменатель.

person Roger Dahl    schedule 12.02.2014