разница в скорости между массивами char и integer? - PullRequest
5 голосов
/ 26 сентября 2008

В настоящее время я имею дело с программным обеспечением для обработки видео, в котором данные изображения (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 будет использоваться в будущем, и в этом случае char-массивы, в отличие от массивов int, уже имеют формат упакованный . Так какая версия будет быстрее?

Ответы [ 4 ]

5 голосов
/ 26 сентября 2008

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

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

1 голос
/ 26 сентября 2008

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

0 голосов
/ 03 февраля 2009

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

0 голосов
/ 26 сентября 2008

наоборот, упаковка и распаковка - это дорогостоящие команды процессора.

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

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

...