|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|||||||||||||||||||||
Оптимизация алгоритма20.03.2021, 17:18. Показов 2265. Ответов 42
Добрый день уважаемые фоумчане.
Как-то давеча я создавал тему на форуме http://www.cyberforum.ru/cpp-b... 65826.html, в которой уважаемый L0M помог мне с алгоритмом написания нарезчика бит. В данный момент, проведя эксперименты и тесты, я понял что работает нарезчик достаточно медленно (~ +- 32 сек на массив unsigned char на 2 000 000 000 элементов, ~ +- 76 сек на массив unsigned short на 2 000 000 000 элементов и т.д.) Собственно я и решил после этого что-то своё написать в надежде что битовые смещения работают побыстрее битовых масок (с учетом того, что в отличии от масок битовых смещениями я смогу получать сразу перечень данных), но как-то быстрее не стало, а только медленнее. Что делает нарезчик: - принимать в себя массив указателей или указатель на вектор произвольного целочисленного типа данных и порядок бит (прямой - старший бит становится младшим, обратный - классический машинный вариант). - перепрыгивать через N бит. - дописывать биты (с учетом порядка бит) в конец послупившего буфера N бит, если эти N бит вмещаются в тип данных буфера. - остальной функционал не важен - просто баловство. Прошу помощи в этом деле, может быть я где-то был не прав при написании или что-то ещё. Мне бы секунд до 10 - 20 при любых результатах... Вот исходники нарезчика, алгоритм которого любезно предоставил уважаемый L0M:
P.S.: Самое забавное что под дебагом мой нарезчик побыстрее будет (оптимизация творит чудеса...), а вот в релизе всё становится печально, результаты фиксированно в приделах 110 сек... Добавлено через 2 часа 42 минуты Сделал кое-какие изменения во втором нарезчике (который сам писал), а именно в функции cutBits, которая и требует оптимизации:
Спасибо.
0
|
|||||||||||||||||||||
| 20.03.2021, 17:18 | |
|
Ответы с готовыми решениями:
42
Оптимизация алгоритма Оптимизация алгоритма
|
|
Мозгоправ
|
||
| 22.03.2021, 16:54 | ||
|
У вас планируется numberBits постоянным для каждого заплыва (как сейчас у вас это реализовано в тестовой программе)? Или оно будет плавать от 1 до какого-то предела при каждом вызове cutBits()? Если будет плавать, попробуйте ещё протестировать с рандомным значением numberBits для каждого вызова cutBits(). Если numberBits постоянно для наждого массива данных, то параллелится достаточно просто. Массив "пилится" на куски, кратные НОК(numberBits, sizeof(array_type) * 8) / sizeof(array_type) * 8. Каждый кусок отдаётся на обработку в отдельный поток. Сколько будет выходных данных для каждого куска - тоже вычисляется. Значит смещение в выходном буфере тоже считается.На уровне идеи: ещё есть векторные инструкции SIMD: всякие SSE, AVX и пр. Может в эту сторону можно подумать.
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||
| 22.03.2021, 17:47 [ТС] | ||
|
Значение numberBits при каждом выполнение будет рандомным, т.к. этот класс направлен на распиливание сырого массива растровых данных формата TIFF, а в соответствии со спецификацией данные могут быть разными, в диапазоне от 1 - 64 бит на один цветовой канал изображения.
По поводу фиксированности - тут тоже не все однозначно, есть вероятность встретить растры с разным количеством бит на канал, поэтому вариант с разделением на равные куски не кажется мне удачным. Добавлено через 42 минуты По поводу правдивости моего высказывания о разных значениях количества бит на компонент - Ссылка
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 18:39 [ТС] | |
|
Как раз решил написать, и для работы, и для себя, ну и для защиты диплома (так сказать актуальность выражена в возможности читать файлы с произвольным количеством бит на канал изображения). И именно для этого мне и нужен битовый нарезчик дабы обойти это ограничение, которое присутствует в LibTiff, ну и плюсом в LibTiff нет удобного интерфейса для работы с содержимым файла.
Собственно вот такие дела.
0
|
|
|
Мозгоправ
|
|||
| 22.03.2021, 19:38 | |||
![]() Посмотрел я на краткое описание TIFF в Википедии... Но, как говорится, вода камень точит... При чтении "по диагонали" зацепился за один раздельчик:
В полоске (aka стрипе) данные скомпрессированы. (Компрессоры/декомпрессоры всех задекларированных в стандарте TIFF форматов сжатия вы тоже будете сами писать? Или всё-таки воспользуетесь готовыми решениями?). Вопрос: после декомпрессии данные по каналам тоже будут в виде потока бит? Или всё же будут выровнены по границе байта? Это два. Это я к тому, что может можно обойтись малой кровью в плане cutBits()? PS. Я ни разу не специалист по TIFF и вообще по обработке изображений, а также по алгоритмам компрессии.
0
|
|||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
||||||
| 22.03.2021, 19:56 [ТС] | ||||||
|
Да, Вы правы, данные растра выравнены до границы байта. Но есть нюанс, заключается он в том, что есть два варианта расположения данных в файле (за это отвечает тег PlanarConfiguration[284]):
- данные лежат подряд (на примере с цветовым пространством RGB - ...RGBRGBRGB...). - данные лежат поканально(на примере с цветовым пространством RGB - ...RRR... ...GGG... ...BBB...). А данные я буду возвращать пользователю в объектах (спецификация определяет "Полосы" и "Плитки"(Тайлы)), которые уже будут содержать в себе данные нарезанные поканально и разложеные по минимальной единице - байту Ну и соответственно такое архитектурное решение накладывает ограничения. В теории я мог бы многопоточно читать данные, но возникнут сложности с размещением данных в моих объектах. Пока реализую так как задумал, точнее перепишу что наваял в черновом варианте. Добавлено через 7 минут По поводу схем распаковки, думаю писать их сам, не очень хотелось бы тянуть за сабой кучу всего, да и при этом подавляющее большинство данных которые я буду читать запакованы LZW и PackBits. Вторую схему я уже накидал, вот к примеру:
0
|
||||||
|
Мозгоправ
|
||
| 22.03.2021, 19:59 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:03 [ТС] | |
|
Да, тут вы правы, если совсем честно, то с многопоточностью у меня не очень, может как-нибудь руки дойдут, но не сейчас, сроки поджимают.
0
|
|
|
Мозгоправ
|
|||
| 22.03.2021, 20:25 | |||
![]() Во-первых, чисто технически. Почему функция возвращает bool? "Не шмогла"? Далее, смотрим if-ы в цикле: -128 - понятно, от -127 до 0 - понятно, от 0 и больше - понятно. Строки 23-24 в каком случае будут выполнены? Цикл for с модификацией переменной цикла внутри тела цикла - не лучшая идея. Цикл while с явным инкрементом IndexPackString в нужных местах здесь будет уместнее. Во-вторых, std::vector.insert() может вызывать перераспределение памяти. Это дорогая операция. Поэтому, если вам известно количество распакованных данных (по размеру стрипа/тайла/строки/изображения), то лучше заранее через std::vector.resize() выделить необходимое место. А данные потом копировать через обращение по индексу или вообще вызовом memset или memcpy.Добавлено через 1 минуту
0
|
|||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:32 [ТС] | |
|
По первому, да, именно так - угадали.
По второму, вообще не выполнятся, работа ведь происходит со знаковым целым 8 битным. На счет выделения, да, разумно. Спасибо что указали на косяки, давно эту функцию не смотрел.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 20:52 [ТС] | |
|
то возвращаемое значение вообще бесмысслено делать для этой функции, либо если есть нюансы связанные с проверкой длины исходного массива, то в таком случае нужно.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:03 [ТС] | |
|
И снова благодарю Вас за мудрые наставления!
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 22.03.2021, 21:24 | |
|
Aringot, а разве из поста про который упоминалось в шапке, не видно о том что структура файла байтовая.
И из отрывка я не понял что за формат такйо при котором нужно работать над битами как над отдельной структурой. ? Добавлено через 1 минуту Я хочу сказать что такие манипуляции делаются только при чтении/записи файла, но не при обработке.
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:26 [ТС] | |
|
SmallEvil, теговая структура файла байтовая, но данные растра могут иметь размер цветовой компоненты которая меньше одного байта.
Так я файлы данного формата собираюсь читать и отрисовывать, возможно писать(но это не точно).
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 22.03.2021, 21:32 | |
|
Aringot, понятно, что мешает обойтись без нарезки ?
економия озу ? или это алгоритм декомпрессии ?
0
|
|
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:38 [ТС] | |
|
В растре данные идут подряд, то есть без выравнивания до байта, выравнивание есть только между концом и началом новой строки изображения.
Как я уже упоминал ранее, формат поддерживает различное количество бит на цветовую компоненту (например: 4,5,4 бит для RGB или 3,4,4 бит и т.д.), а идея в том, что бы эти данные разложить в приделах минимально вместимого типа данных. Таким образом речь о какой-либо экономии озу не идёт, экономиться она будет с помощью произвольного чтения по номеру объекта изображения (строки/тайла), а не чтения целого изображения.
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 22.03.2021, 21:40 | ||
|
ладно, завтра ознакомлюсь с форматом . дайте спецификацию, точное название формата.
0
|
||
|
2 / 2 / 0
Регистрация: 24.05.2016
Сообщений: 88
|
|
| 22.03.2021, 21:44 [ТС] | |
|
0
|
|
| 22.03.2021, 21:44 | |
|
Помогаю со студенческими работами здесь
40
Оптимизация алгоритма Оптимизация алгоритма быстрого поиска Оптимизация алгоритма вычисления определителя матрицы Оптимизация алгоритма нахождения максимального элемента Оптимизация алгоритма перемножения двух матриц Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|