Динамическое распределение памяти в функциях __global__ - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть карта CC 1.1, и моя программа позволяет мне динамически распределять массивы в global или устройстве функциях.

Эти массивы будут созданы для выполнения каждого потока.

malloc выдает ошибку, и серфинг в Интернете говорит мне, что использование malloc недопустимо для CC менее 2.0.

Я хочу спросить, есть ли обходной путь?

Спасибо

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Я бы посоветовал вам использовать память фиксированного размера:

__global__ my_kernel(...) {

__shared__ float memory[BLOCK_SIZE];

};

динамическое выделение на графическом процессоре редко требуется и может привести к некоторому узкому месту в производительности.И особенно с вычислительной способностью 1.1 вам нужно будет настроить выравнивание разделяемой памяти, чтобы иметь лучшие характеристики и избежать конфликта памяти внутри Warp.

1 голос
/ 17 сентября 2011

Для устройств CC1.1 единственным обходным решением является выделение достаточного количества глобальной памяти от хоста с cudaMalloc, а затем разделение ее между потоками.

В большинстве случаев простое предварительное выделение памяти из хоста работает довольно хорошо иЯ никогда не сталкивался с задачей, в которой у одного было бы для использования ядра malloc (хотя иногда такая идея казалась хорошей, быстро выяснялось, что это не , что хорошо нарушать совместимость сстарые устройства. Также у меня есть подозрения относительно его производительности, но я никогда не запускал тесты).

...