在這個 CUDA 程式下面,我想在 Ubuntu 20.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
uj5u.com熱心網友回復:
對于打算容納 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這些操作的所有引數都是以位元組為單位的大小。所以不是64,在每個地方都應該是sizeof(int)*64。
有一個名為的 CUDA 示例應用程式vectorAdd,您可以在其中看到一個示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405287.html
標籤:
