2013-08-02 3 views
2

Я пытаюсь использовать несколько массивов двойников в ядре с одинаковой длиной. Вместо того, чтобы передавать каждый double * в качестве отдельного аргумента, я знаю, что могу определить структуру в файле .cl, содержащую несколько парных, а затем просто передать в ядро ​​один указатель на массив структур.Производительность OpenCL: использование массивов примитивов и массивов структур

Будет ли производительность отличаться для двух способов? Пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что передача отдельных двойных указателей означает, что доступ можно объединить. Будет ли объединен доступ к структурам?

+0

Привет, Томас, я имел в виду, что вместо того, чтобы иметь 20 массивов по 100 удваиваний каждый, у меня будет массив из 100 структур, каждый из которых содержит 20 парных разрядов - не одна структура с 20 двойными указателями. – Mizerable

+0

Ах, моя ошибка. Я думал, что вам нужно объединить массивы 'double *' в одну структуру, а не разбивать массив на несколько структур. – Thomas

ответ

-1

Структуры и отдельные элементы будут иметь одинаковую производительность. Предположим, у вас есть большой массив двухместных номеров, а в первом задании используются 0, 100, 200, 300, ... и в следующем используются 1, 101, 201, 301, ...

Если у вас есть структура из 100 удваивается, в памяти первая структура будет первой (0-99), затем второй (100-199) и т. д. Ядра будут иметь точно такую ​​же память и в тех же местах, единственное различие заключается в том, как вы определяете абстракцию памяти.

В более общем случае наличия структуры разных типов элементов (char, int, double, bool, ...) может случиться так, что aligment не так, как если бы это был единственный массив данных. Но он по-прежнему будет «полуколлирован». Я бы даже поставил на то, что производительность все та же.

+0

Я не совсем понимаю ... Если есть много массивов, каждый 100 длинный, как вы предлагаете, то первый рабочий элемент получает доступ к одному двойнику в первых 100 двухместных, и ничто другое в первых 100 двухместных. В сравнении можно сказать, что у вас есть структура, содержащая 20 удвоений (скажем, изначально было 20 массивов по 100 длины), тогда первый рабочий элемент получает только первые 20 парных и ничего больше. Итак, это совсем другое, повлияет ли это на объединение? – Mizerable

+0

Да, они разные. Но это повлияет на него так же, как если бы вы делали то же самое использование памяти, заказанной в одном длинном массиве. Таким образом, структура здесь не проблема.Только, как вы используете эту память. – DarkZeros

+0

DarkZeros, вы совершенно правы. Я просто втянул его и попробовал. Я использовал 8 миллионов структур в 4 двойных числа по сравнению с 4 массивами удвоений каждые 8 ​​миллионов. Операция заключалась в том, чтобы суммировать 4 i-й парный разряд для каждого из 8 миллионов потоков. На моем 7970 GHZedition реализация структуры занимает ~ 6% больше времени. Я сделал дюжину пробегов или около того, и результаты очень последовательны. В любом случае, это небольшой штраф за огромное улучшение в программировании! – Mizerable

0

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

Сказать, что один экземпляр, в котором я использовал структуру таким образом, очень успешно - это тот, где чтение элемента одинаково для всех рабочих элементов в рабочей группе. В этом случае на моем оборудовании нет штрафа (nvidia GTX 570). Также стоит помнить, что в некоторых случаях добавленная латентность, вводимая сериализацией памяти, может быть скрыта. В мире CUDA это будет достигнуто за счет высокой занятости для проблемы с высокой интенсивностью арифметики.

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

0

Теоретически это то же самое. Однако, если вы чаще обращаетесь к некоторым членам, использование нескольких segregatedvarrays будет иметь гораздо большую производительность из-за локализации кэша процессора. Однако большинство операций будет сложнее, если у вас несколько массивов.

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