CUDA:将1D阵列从CPU复制到GPU

时间:2018-12-17 10:55:11

标签: cuda dynamic-arrays

我是Cuda的新手,试图通过cudaMemcpy(...)将阵列从主机复制到设备 但是,传递给GPU的数据似乎完全不同(对于成本:完全错误,对于G:在索引5后错误)

例如,我的数据是大小为25的malloc数组(用C编写), 我尝试通过以下方式进行复制(最大值= 5):

声明:

int *cost, int* G
int *dev_cost, *dev_G;

分配:

cost = (int*)malloc(MAX* MAX * sizeof(int));
G = (int*)malloc(MAX* MAX* sizeof(int));
cudaMalloc((void**)&dev_cost, MAX*MAX);
cudaMalloc((void**)&dev_G, MAX*MAX);

数据传输:

cudaMemcpy(dev_cost, cost, MAX*MAX, cudaMemcpyHostToDevice);
cudaMemcpy(dev_G, G, MAX*MAX, cudaMemcpyHostToDevice);

内核触发器:

assignCost<<<1,MAX*MAX>>>(dev_G,dev_cost);

内核功能:

__global__ void assignCost(int *G, int *cost)
{
    int tid = threadIdx.x + blockDim.x*blockIdx.x;

    printf("cost[%d]: %d G[%d] = %d\n", tid, cost[tid], tid, G[tid]);
    if(tid<MAX*MAX)
    {
        if (G[tid] == 0)
            cost[tid] = INT_MAX;
        else
            cost[tid] = G[tid];
    }
}

我的方法有什么问题吗?如果那样的话,我该如何修改?

1 个答案:

答案 0 :(得分:3)

cudaMemcpy(dev_cost, cost, MAX*MAX*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_G, G, MAX*MAX*sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy的第三个参数是字节中的计数。由于您有MAX*MAX个整数,并且每个整数的大小为sizeof(int)个字节,因此将MAX*MAX替换为MAX*MAX*sizeof(int)