Распределение памяти CUDA - эффективно ли это - PullRequest
0 голосов
/ 07 июня 2011

Это мой код.У меня много потоков, так что эти потоки вызывают эту функцию много раз.Внутри этой функции я создаю массив.Это эффективная реализация ??Если это не так, предложите мне эффективную реализацию.

__device__ float calculate minimum(float *arr)
 {
     float vals[9];      //for each call to this function I am creating this arr
                        // Is it efficient?? Or how can I implement this efficiently?
                        // Do I need to deallocate the memory after using this array?
     for(int i=0;i<9;i++)
         vals[i] = //call some function and assign the values
     float min = findMin(vals);
     return min;
 }

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

В этом коде нет "создания массива". Есть статически объявленный массив. Кроме того, стандартная модель компиляции CUDA будет встроенно расширять функции __device__, что означает, что vals будет скомпилирован в локальной памяти или, если возможно, даже в регистрах.

Все это происходит во время компиляции, а не во время выполнения.

1 голос
/ 07 июня 2011

Что касается "float vals [9]", это будет эффективно в CUDA. Для массивов небольшого размера компилятор почти наверняка выделит все элементы непосредственно в регистры. Таким образом, «vals [0]» будет регистром, «vals [1]» будет регистром и т. Д.

Если в компиляторе не хватает регистров или размер массива превышает 16, используется локальная память. Вам не нужно беспокоиться о выделении / освобождении локальной памяти, компилятор / драйвер сделает все это за вас.

Устройства с вычислительной способностью 2.0 и выше имеют стек вызовов для таких вещей, как рекурсия. Например, вы можете установить размер стека до 6 КБ на поток с помощью:

cudaStatus = cudaThreadSetLimit(cudaLimitStackSize, 1024*6);

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

1 голос
/ 07 июня 2011

Возможно, я что-то упустил, но из кода, который вы опубликовали, вам вообще не нужен временный массив.Ваш код будет (немного) быстрее, если вы сделаете что-то вроде этого:

 #include "float.h" // for FLT_MAX

__device__ float calculate minimum(float *arr)
 {
     float minVal = FLT_MAX:
     for(int i=0;i<9;i++)
         thisVal = //call some function and assign the values
         minVal = min(thisVal,minVal);
     return minVal;
 }

Если массив действительно необходим, нет ничего плохого в том, чтобы объявить его таким образом (как говорили многие другие).

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