CUDA-设备全局指针,内存分配和内存访问

时间:2019-05-12 16:01:53

标签: cuda

我想使用全局变量在两次内核调用之间将数据保存在内存中,但是我无法弄清楚如何分配内存以及如何正确访问它。下面的代码给出了错误的输出。

我需要使用指针,因为我的设备方法“输出”了未知的数据大小。该程序将在有向图中寻找强连通的顶点-显然可能没有,也可能有milion。 想法是调用内核,询问数据有多大,然后将其内存复制到主机内存。我是cuda的新手,所以我不知道有什么设计方法可以解决我的问题。

__device__ int* d_array;

  __global__ void doCalculation(int* adr, int testSize) {
        // Index evaluation
    int threadsPerBlock = blockDim.x * blockDim.y * blockDim.z;
    int threadPosInBlock = threadIdx.x +
        blockDim.x * threadIdx.y +
        blockDim.x * blockDim.y * threadIdx.z;
    int blockPosInGrid = blockIdx.x +
        gridDim.x * blockDim.y +
        gridDim.x * gridDim.y * blockIdx.z;
    int tid = blockPosInGrid * threadsPerBlock + threadPosInBlock;

        // "calculations"
    if (tid < testSize) {
        adr[tid] = 1;
    }
}

void startCalculation() {
    dim3 block(8, 8, 8);
    dim3 grid(16,16);
    int testSize = 5;

    cudaMalloc(&d_array, testSize * sizeof(int));
    int* d_addr;
    cudaGetSymbolAddress((void**)&d_addr, d_array);

    doCalculation<<<grid, grid>>>(d_addr, testSize);
    cudaDeviceSynchronize();

    int* array = (int*)malloc(testSize * sizeof(int));
    cudaMemcpyFromSymbol(array, d_array, testSize*sizeof(int));

    for (int i = 0; i < testSize; i++)
    {
        std::cout << "Array at " << i << " is " << array[i] << std::endl;
    } //This outputs -842150451 in my case
}

0 个答案:

没有答案