为什么这个 CUDA 程序输出左元素为 0?

Why does this CUDA program output left elements as 0?

下面这个CUDA程序,我想在Ubuntu20.04(我的GPU是3080Ti)的GPU上计算两个向量的相加。两个向量都包含 64 个元素。我将每个块和每个网格分别设置为 4×4 和 2×2,总共 64 个线程。编译后,我执行程序。但是结果vec3是0-15的元素都是64,之后左边的元素都是0,这是为什么呢?

#include<iostream>
using namespace std;

__global__ void vector_mul(int *const c_vector,const int *const a_vector,const int *const b_vector){
        const unsigned int idx=blockIdx.x*blockDim.x+threadIdx.x;
        const unsigned int idy=blockIdx.y*blockDim.y+threadIdx.y;
        const unsigned int thid=(idy*blockDim.x*gridDim.x)+idx;

        c_vector[thid]=a_vector[thid]+b_vector[thid];
}
int vec1[64];
int vec2[64];
int vec3[64];
int main(void){
       const dim3 thread_layout(4,4);
       const dim3 block_layout(2,2);
       for(int i=0;i<64;i++){
               vec1[i]=i;
               vec2[i]=64-i;
       }


       //declare gpu pointer
       int *gpu_vec1;
       int *gpu_vec2;
       int *gpu_vec3;

       //allocate gpu memory to gpu pointer
       cudaMalloc((void**)&gpu_vec1,64);
       cudaMalloc((void**)&gpu_vec2,64);
       cudaMalloc((void**)&gpu_vec3,64);

       //copy data from host to device
       cudaMemcpy(gpu_vec1,vec1,64,cudaMemcpyHostToDevice);
       cudaMemcpy(gpu_vec2,vec2,64,cudaMemcpyHostToDevice);


       vector_mul<<<block_layout,thread_layout>>>(gpu_vec3,gpu_vec1,gpu_vec2);

       cudaMemcpy(vec3,gpu_vec3,64,cudaMemcpyDeviceToHost);
       for(int i=0;i<64;i++)
                cout << vec3[i] <<endl;
       cudaFree(gpu_vec1);
       cudaFree(gpu_vec2);
       cudaFree(gpu_vec3);
       return 0;
}                                                                                                                                                                              1,1           Top

对于旨在容纳 64 int 个元素的数组:

int vec1[64];
...
   for(int i=0;i<64;i++){
           vec1[i]=i;

这些不正确:

   cudaMalloc((void**)&gpu_vec1,64);
   cudaMalloc((void**)&gpu_vec2,64);
   cudaMalloc((void**)&gpu_vec3,64);
   ...
   cudaMemcpy(gpu_vec1,vec1,64,cudaMemcpyHostToDevice);
   cudaMemcpy(gpu_vec2,vec2,64,cudaMemcpyHostToDevice);
   ...
   cudaMemcpy(vec3,gpu_vec3,64,cudaMemcpyDeviceToHost);

这些操作的所有 size 参数的大小都是 字节 。所以在每个地方它应该是 sizeof(int)*64.

而不是 64

有一个名为 vectorAdd 的 CUDA 示例应用程序,您可以在其中查看相关示例。