CUDA статически распределяет данные на устройстве - PullRequest
1 голос
/ 11 мая 2011

Я пытался выделить переменную, к которой может обращаться каждая функция ядра.Моя попытка - это код, прикрепленный ниже, но он не скомпилируется, потому что ядро ​​не может просмотреть 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 ]

5 голосов
/ 12 мая 2011

В CUDA могут быть глобальные переменные типа __device__ или __constant__.Так, например, если вы инициализируете переменную-указатель __constant__ по адресу указателя устройства, используя cudaMemcpyToSymbol(), вы можете получить доступ к этому указателю через переменную __constant__:

__constant__ int* dArrayPtr;

__global__ void StoreThreadNumber()
{
    dArrayPtr[threadIdx.x] = threadIdx.x;
}

Просто выполнитеперед тем, как запустить ядро, убедитесь, что вы правильно инициализировали dArrayPtr из своего кода хоста.

2 голосов
/ 11 мая 2011

Вы не можете.Вы должны передать ядру указатель на dArray.

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

...