CUDA статически распределяет данные на устройстве
Я пытался выделить переменную, к которой может обращаться каждая функция ядра. Моя попытка - это код, прикрепленный ниже, но он не скомпилируется, потому что ядро не может просмотреть dArray. В C++ вы должны поместить переменную вверху или объявить static для доступа к любой области действия программы.
__global__ void StoreThreadNumber()
{
dArray[threadIdx.x] = threadIdx.x;
}
int main( int argc, char** argv)
{
unsigned __int8 Array[16] = { 0 };
unsigned __int8 dArray[16];
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaMalloc((void**) dArray, 16*sizeof(__int8));
cudaMemcpy( dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice);
StoreThreadNumber<<<1, 16>>>();
cudaMemcpy( Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost);
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaFree(dArray);
}
2 ответа
Вы можете иметь глобальные переменные в CUDA, типа __device__
или же __constant__
, Так, например, если вы инициализируете __constant__
переменная указателя на адрес указателя устройства с помощью cudaMemcpyToSymbol()
, вы можете получить доступ к этому указателю через __constant__
переменная:
__constant__ int* dArrayPtr;
__global__ void StoreThreadNumber()
{
dArrayPtr[threadIdx.x] = threadIdx.x;
}
Просто убедитесь, что вы правильно инициализируете dArrayPtr из своего хост-кода, прежде чем запускать ядро.
Ты не можешь Вы должны передать указатель на dArray ядру.
У меня была та же проблема с передачей большого количества глобальных данных в GPU. В итоге я завернул все это в структуру и передал указатель на него.