Cuda:将一维数组从 CPU 复制到 GPU
Cuda: Copy 1D Array From CPU to GPU
我是 Cuda 的新手,正在尝试通过 cudaMemcpy(...) 将数组从主机复制到设备
但是,传递给 GPU 的数据似乎完全不同(对于成本:完全错误,对于 G:在索引 5 之后错误)
例如,我的数据是大小为 25 的 malloc 数组(用 C 语言编写),
我尝试通过以下方式复制(MAX = 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];
}
}
我的做法有什么问题吗?如果是的话,应该怎么修改?
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)
我是 Cuda 的新手,正在尝试通过 cudaMemcpy(...) 将数组从主机复制到设备 但是,传递给 GPU 的数据似乎完全不同(对于成本:完全错误,对于 G:在索引 5 之后错误)
例如,我的数据是大小为 25 的 malloc 数组(用 C 语言编写), 我尝试通过以下方式复制(MAX = 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];
}
}
我的做法有什么问题吗?如果是的话,应该怎么修改?
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)