Какие преобразования используются системами с прямым порядком байтов для преобразования данных в сетевой порядок?

Размер локального буфера __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, если вы не хотите запускать профилировщик, чтобы получить лучшее представление о том, что это такое.

7
задан Cœur 19 February 2017 в 08:19
поделиться

5 ответов

Скажем, у Вас есть текст 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-разрядного слова.

6
ответ дан 7 December 2019 в 10:09
поделиться

1-байтовые данные не требуют никакого преобразования между порядками байтов (это - преимущество UTF-8 по UTF-16 и UTF-32 для строкового кодирования).

0
ответ дан 7 December 2019 в 10:09
поделиться

Определенные функции обработки для 2-и 4-байтовых данных используют в своих интересах то, что существуют инструкции по процессору, которые воздействуют на определенные размеры данных. Выполнение реверсивной функции 1 байта четыре раза, конечно, менее эффективно, чем использование более широких инструкций выполнить то же (хотя увеличено по своим масштабам) операции на всех четырех байтах сразу.

0
ответ дан 7 December 2019 в 10:09
поделиться

действительно ли 4-байтовое выравнивание необходимо для сетевого порядка байтов?

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

0
ответ дан 7 December 2019 в 10:09
поделиться

Основная идея состоит в том, что все многобайтовые типы должны иметь порядок своих инвертированных байтов. Четырехбайтовое целое число имело бы байты 0 и 3 подкачанных, и байты 1 и 2 подкачанных. Двухбайтовое целое число имело бы байты 0 и 1 подкачанный. Однобайтовый символ не становится подкачанным.

Существует два очень важных последствия этого, что non-practicioners и новички не всегда понимают:

  1. (ASCII) Символьные строки не затронут.
  2. Нет никакого возможного слепого алгоритма к универсальным "данным" подкачки байта. Необходимо знать тип всех данных и подкачать каждый объект, таким образом требуемый для его типа.
0
ответ дан 7 December 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: