200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

时间:2023-11-26 23:49:18

相关推荐

cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

gpu程序的一般步骤

CPU分配空间给GPU(cudaMalloc)CPU复制数据给GPU(cudaMemcpy)CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的一个函数function)CPU把GPU计算结果复制回来

过程中,一般要尽量降低数据通讯的消耗,所以如果程序需要复制大量的数据到GPU,显然不是很合适使用GPU运算,最理想的情况是,每次复制的数据很小,然后运算量很大,输出的结果还是很小,复制回CPU。

先做一个小demo,对一个8位数组求平方,很简单

global 关键字那个函数就是在GPU上运行,我们先写完kernel,那还需要从cpu拿数据过去也就是上面的1和2 这里我们为了区分cpu和gpu变量,用h_表示cpu变量(host),用d_表示gpu变量(device),host和device我们在之前的概论提了这里就不解释了。

#include <stdio.h>//这个就是kernel__global__ void square(float* d_out,float* d_in){int idx = threadIdx.x;float f = d_in[idx];d_out[idx] = f * f;}int main(int argc,char** argv){const int ARRAY_SIZE = 8;const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);// 在cpu中定义要输入的数组float h_in[ARRAY_SIZE];for(int i=0;i<ARRAY_SIZE;i++){h_in[i] = float(i);}float h_out[ARRAY_SIZE];// 声明gpu指针float* d_in;float* d_out;// 对应1步骤,给gpu指针分配内存空间,和cpu上的数据空间一样大cudaMalloc((void**) &d_in,ARRAY_BYTES);cudaMalloc((void**) &d_out,ARRAY_BYTES);// 对应步骤2,把cpu数据复制给gpucudaMemcpy(d_in,h_in,ARRAY_BYTES,cudaMemcpyHostToDevice);// 对应步骤3,把kernel也就是square,加载到gpu上运行,1是一个线程块,其中有64个线程,1个时钟周期就可以结束运算square<<<1,ARRAY_SIZE>>>(d_out,d_in);// 对应步骤4,把gpu数据复制给cpucudaMemcpy(h_out,d_out,ARRAY_BYTES,cudaMemcpyDeviceToHost);// 输入结果for(int i=0;i<ARRAY_SIZE;i++){printf("%f",h_out[i]);printf(((i%4) != 3) ? "\t" : "\n");}// 释放内存cudaFree(d_in);cudaFree(d_out);return 0;}

那我们运行一下看看,先编译,cuda 程序后缀是.cu

nvcc -o square square.cu

square就是我们刚编译出来的程序

运行一下看看

结果就是0-7的平方,正确

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。