Лучшее место для постоянной памяти, которая известна до запуска ядра и никогда не менялась - PullRequest
1 голос
/ 19 октября 2011

У меня есть массив целых чисел, размер которых известен до запуска ядра, но не на этапе компиляции. Верхняя граница размера составляет около 10000 элементов типа float3 (я думаю, это означает 10000 * 3 * 4 = ~ 120 КБ). Не известно во время компиляции.

Все потоки сканируют линейно (не более) всех элементов в массиве.

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Вы можете проверить размер во время выполнения, тогда, если он подойдет, используйте cudaMemcpyToSymbol, или иначе используйте текстуру или глобальную память.Это немного грязно, у вас должен быть какой-то параметр, чтобы сообщить ядру, где находятся данные.Как всегда, всегда проверяйте фактическую производительность.Разные шаблоны доступа могут иметь разную скорость в разных типах памяти.

Другая мысль - сделать шаг назад и снова взглянуть на алгоритм.Часто есть способы разделить проблему по-разному, чтобы постоянная таблица всегда помещалась в постоянную память.

0 голосов
/ 19 октября 2011

Вы можете вычислить свободную постоянную память после компиляции ваших ядер и распределять ее статически.

__constant__ int c[ALL_I_CAN_ALLOCATE];

Затем скопируйте ваши данные в постоянную память с помощью cudaMemcpyToSymbol ().

Я думаю, что это может ответить на ваш вопрос, но ваши требования к постоянной памяти превышают пределы GPU.

Я порекомендую другие подходы, т. Е. Использовать разделяемую память, которая может передавать данные, если все потоки в полупериоде считывают из того же места.

0 голосов
/ 19 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...