我正在学习CUDA编程。为了弄清楚什么是cudaMemcpy()的复制单元和cudaMalloc()的传输单元,我编写了下面的代码,它添加了两个向量vector1和vector2,并将结果存储到vector3中。但是,在编译和执行之后,vector3中的结果并不像预期的那样。我不太清楚是什么问题。但是,据推测,函数cudaMalloc和cudaMemcpy可能被错误地使用了。有人知道问题到底在哪里吗?
#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
发布于 2022-01-07 15:05:55
对于打算保存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);
这些operatiosn的所有size
参数都是以字节为单位的大小。所以,在每个地方都应该是64
,而不是sizeof(int)*64
。
有一个名为vectorAdd
的CUDA示例应用程序,您可以在其中看到这个示例。
https://stackoverflow.com/questions/70619355
复制相似问题