Разница в скорости между символьными и целочисленными массивами?

в настоящее время я имею дело с программным обеспечением для обработки видео, в котором данные изображения (8-битные подписанные и беззнаковые) хранятся в массивах 16-выравниваемых целых чисел, выделенных как

__declspec(align(16)) int *pData = (__declspec(align(16)) int *)_mm_malloc(width*height*sizeof(int),16);

В общем, разве это не обеспечило бы более быстрое чтение и запись, если бы использовались массивы подписанных / беззнаковых символов вроде этого ?:

__declspec(align(16)) int *pData = (__declspec(align(16)) unsigned char *)_mm_malloc(width*height*sizeof(unsigned char),16);

Я мало знаю о размере строки кэша и оптимизации передачи данных, но, по крайней мере, знаю, что это проблема. Помимо этого, в будущем будет использоваться SSE, и в этом случае массивы символов - в отличие от массивов int - уже находятся в формате упакованный. Так какая версия будет быстрее?

почему бы вам не протестировать его, есть масса вещей, которые теоретически могут работать, но на практике имеют разные эффекты. Проверьте это и убедитесь сами, что быстрее. Никто не может ответить на этот вопрос, если он имеет представление о производительности ... среда - это то, что определяет окончательную производительность.

Pop Catalin 26.09.2008 12:16

То, что мы думаем, на самом деле не имеет значения. Чтобы получить ответ, вам нужно запустить тест.

Andy Brice 26.09.2008 12:19

Обе версии будут работать с одинаковой скоростью. Это «последний» тип, который имеет значение, он по-прежнему int * и будет обрабатываться компилятором как таковой. Кроме того, во второй версии у вас могут возникнуть проблемы с переполнением буфера (вы выделили в 4 раза меньше памяти, чем в первой версии, этого достаточно?)

yrp 26.09.2008 12:24

Я удалил тег C++ из вашего вопроса, поскольку он не имеет ничего общего с этим языком.

Ashwin Nanjappa 26.09.2008 13:00

В данном случае я действительно ненавижу фразу "просто протестируйте это!" ответы. Да, это окончательный ответ, но он также невероятно бесполезен, если это единственный ответ, который вы можете здесь найти на вопросы скорости. Однако ответ Дарк Шикари дает гораздо больше.

Anthony 02.11.2009 10:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
5
1 482
4

Ответы 4

Напротив, упаковка и распаковка - дорогостоящие команды ЦП.

если вы хотите выполнить много случайных операций с пикселями - быстрее сделать его массивом int, чтобы каждый пиксель имел свой собственный адрес.

но если вы последовательно просматриваете свое изображение, вы хотите создать массив символов, чтобы он был маленьким по размеру и уменьшал вероятность ошибки страницы (особенно для больших изображений)

У каждого char есть свой адрес. Наполовину связанный: Может ли современное оборудование x86 не хранить в памяти ни одного байта? Ответ: да, может, люди, утверждающие, что процессоры могут выполнять только загрузку / сохранение всего слова, ошибаются.

Peter Cordes 22.11.2017 14:09

Если вы планируете использовать SSE, хранение данных в исходном размере (8-бит) почти наверняка будет лучшим выбором, поскольку множество операций можно выполнять без распаковки, и даже если вам нужно распаковать для pmaddwd или другого подобного инструкции, это еще быстрее, потому что вам нужно загружать меньше данных.

Даже в скалярном коде загрузка 8-битных или 16-битных значений не медленнее, чем загрузка 32-битных, поскольку movzx / movsx не отличается по скорости от mov. Так что вы просто экономите память, что точно не повредит.

Это действительно зависит от вашего целевого процессора - вам следует ознакомиться с его спецификациями и выполнить несколько тестов, как все уже предлагали. Многие факторы могут повлиять на производительность. Первое очевидное, что приходит мне в голову, это то, что ваш массив int в 2-4 раза больше, чем массив символов, и, следовательно, если массив достаточно большой, вы получите меньше попаданий в кеш данных, что определенно замедлит вниз производительность.

В некоторых случаях массивы символов могут работать медленнее. Как правило, лучше всего использовать собственный размер слова, который, скорее всего, будет 4-байтовым (32-битным) или 8-байтовым (64-битным). Еще лучше, чтобы все было выровнено по 16 байтам, как вы уже сделали ... это позволит быстрее копировать, если вы используете инструкции SSE (MOVNTA). Если вас беспокоит только перемещение элементов, это окажет гораздо большее влияние, чем тип, используемый массивом ...

Может ли современное оборудование x86 не хранить в памяти ни одного байта? Answer: yes it can, and highly efficiently. So can other modern architectures: everything has load byte (with zero extension) and store byte, except early versions DEC Alpha AXP which famously lacked byte load/store instructions.
Peter Cordes 22.11.2017 14:12

Другие вопросы по теме