Размер локального буфера __local int buf[7072]
(28288 байт) слишком велик. Я не знаю, насколько велика общая память для AMD Radeon Pro 450, но, скорее всего, она составляет 32 или 64 КБ на вычислительную единицу.
32768/28288 = 1
, 65536/28288 = 2
означает, что только 1 или максимум 2 волновых фронта (64 рабочих элемента) могут работать только одновременно, поэтому занятость вычислительного устройства очень очень низкая, следовательно, низкая производительность.
Ваша цель должна заключаться в том, чтобы максимально уменьшить локальный буфер, чтобы одновременно обрабатывать больше волновых фронтов.
Используйте CodeXL
для профилирования вашего ядра - есть инструменты, чтобы показать вам все это. В качестве альтернативы вы можете взглянуть на CUDA occupancy calculator
таблицу Excel, если вы не хотите запускать профилировщик, чтобы получить лучшее представление о том, что это такое.
Скажем, у Вас есть текст ASCII "BigE" в массиве b
из байтов.
b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'
Это - сетевой порядок на строку также.
Если бы это рассматривали как целое число на 32 бита, то это было бы
'B' + ('i' << 8) + ('g' << 16) + ('E' << 24)
на небольшой платформе порядка байтов и
'E' + ('g' << 8) + ('i' << 16) + ('B' << 24)
на платформе с обратным порядком байтов.
При преобразовании каждой 16-разрядной работы отдельно Вы не получили бы ни один из них
'i' + ('B' << 8) + ('E' << 16) + ('g' << 24)
который является почему ntohl
и ntohs
оба требуются.
Другими словами, ntohs
байты подкачек в 16-разрядном коротком, и ntohl
инвертирует порядок четырех байтов его 32-разрядного слова.
1-байтовые данные не требуют никакого преобразования между порядками байтов (это - преимущество UTF-8 по UTF-16 и UTF-32 для строкового кодирования).
Определенные функции обработки для 2-и 4-байтовых данных используют в своих интересах то, что существуют инструкции по процессору, которые воздействуют на определенные размеры данных. Выполнение реверсивной функции 1 байта четыре раза, конечно, менее эффективно, чем использование более широких инструкций выполнить то же (хотя увеличено по своим масштабам) операции на всех четырех байтах сразу.
действительно ли 4-байтовое выравнивание необходимо для сетевого порядка байтов?
Никакое определенное выравнивание не необходимо для байтов, пробегающихся через сеть. Ваш процессор может потребовать определенного выравнивания в памяти, но Вам решать разрешить несоответствие. x86 семейство обычно не требует.
Основная идея состоит в том, что все многобайтовые типы должны иметь порядок своих инвертированных байтов. Четырехбайтовое целое число имело бы байты 0 и 3 подкачанных, и байты 1 и 2 подкачанных. Двухбайтовое целое число имело бы байты 0 и 1 подкачанный. Однобайтовый символ не становится подкачанным.
Существует два очень важных последствия этого, что non-practicioners и новички не всегда понимают: