2013-03-06 2 views
0

Когда у меня есть буфер памяти в OpenCL, я знаю, что мне нужно выровнять данные в нем с 16-байтовой границей.

Но что мне делать, если все мои данные (а не структура данных, фактический сбор данных), например, составляют всего 15 байт?
Должен ли я помещать его в 16-байтовый большой буфер или 15-байтовый?
Есть разница в производительности?Заполнение буфера OpenCL

+0

Итак, вы запускаете ядро ​​с вводом всего 15 байт? Это плохой пример. Если вы используете байты X * 16 + Y, которые не кратно 16, то это более правдоподобно. – DarkZeros

+0

Да, данные больше 15 байт. Но не кратно 16. – Tara

ответ

0

Если вы собираетесь использовать многие из 15-байтовой структуры данных, и вы планируете использовать локальную память, я предлагаю сохранить 15-байтовую структуру и загрузить кратное 16 из них за раз. Я думаю, что «многие» будут иметь как минимум несколько килобайт данных в вашей рабочей группе. Причина этого в том, что, когда вы жертвуете дополнительным байтом на каждые 15, вы добавляете на 6% больше накладных расходов на передачу. Если оставить размер как 15, это также поможет избежать конфликтов в банках при записи данных в память (как в локальной, так и в глобальной памяти).

More info about bank conflicts.

+1

Массив 15-байтных структур, вероятно, не будет выровнен и будет иметь дорогостоящее время доступа. Я рекомендую хранить его на 16 (особенно, поскольку естественное выравнивание большинства устройств, включая GPU, составляет 16 байтов). Конечно, это компромисс производительности/памяти. Я также не понимаю, как размер структуры имеет какое-либо отношение к банковским конфликтам, если что-то делает их хуже из-за неустановленной загрузки/хранения. – Thomas

+0

Прошу пояснить: в моем примере нет 15-байтовых структур данных (я никогда ничего не говорил о структурах). Данные WHOLE составляют 15 байт. Это не обязательно должно быть всего 15 байт. Это может быть любое число, которое не кратно 16. – Tara

Смежные вопросы