为什么这个 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 示例应用程序,您可以在其中查看相关示例。
下面这个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 示例应用程序,您可以在其中查看相关示例。