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. В итоге я завернул все это в структуру и передал указатель на него.

Другие вопросы по тегам