CUDA编程(二) CUDA初始化与核函数

  • 时间:
  • 浏览:1
  • 来源:uu直播快3平台_UU快3直播官方

大伙 还要把产生的数据克隆qq好友好友到Device端的RAM,要能在显卡上完成计算,怎么才能 让大伙 首先开辟一块大约的显存,怎么才能 让把随机数从内存克隆qq好友好友进去。

在上一次中肯能说过了,CUDA安装成功已经 ,新建有2个工程还是十分简单的,直接在新建项目的已经 选者NVIDIA CUDA项目就要能了,大伙 先新建有2个MyCudaTest 工程,删掉自带的示例kernel.cu,怎么才能 让新建项,新建有2个CUDA C/C++ File ,大伙 首先看一下怎么才能 才能 初始化CUDA,怎么才能 让我命名为InitCuda.cu

已经 大伙 再用CPU计算一下来验证一下底下的过程有无有错,这人步还是十分必要的:

计算完了,千万别忘了还要把结果从显示芯片克隆qq好友好友回主内存上,怎么才能 让释放掉内存~

在 CUDA 中,要执行有2个核函数,使用以下的语法:

完成了从内存到显存的数据拷贝已经 ,大伙 接下来就要在显卡上完成计算了,怎么才能 才能 让线程池跑在显卡上?答案是核函数。

完成了CUDA的初始化检查操作,下面大伙 就要能使用CUDA完成或多或少简单计算了,这里大伙 打算计算一系列数字的立方和。

在显示芯片上执行的线程池有或多或少限制,首先最明显的有2个限制——要能 有传回值,还有或多或少或多或少的限制,底下会慢慢提到。

cudaGetDeviceProperties除了要能获得装置支持的 CUDA 版本之外,还有装置的名称、内存的大小、最大的 thread 数目、执行单元的频率等等。详情可参考NVIDIA 的 CUDA Programming Guide。

下面大伙 在Main函数中调用InitCUDA函数,肯能大伙 使用VS,可是我直接ctrl+F5编译执行就要能了,执行时肯能系统上有支持 CUDA 的装置,应该会显示 CUDA initialized。

这段线程池首先会调用cudaGetDeviceCount 函数,获得支持 CUDA 的GPU的数量,肯能计算机要能要能 支持 CUDA 的装置,则会传回 1,而这人1是device 0 ,device0 可是我有2个仿真装置,怎么才能 让CUDA的可是我功能都是支持(不支持CUDA1.0以上版本),怎么才能 让大伙 要真正选者系统上有无有支持CUDA的装置,还要对每个device调用cudaGetDeviceProperties,来获得它们的具体参数,以及所支持的CUDA版本(prop.major 和 prop.minor 分别代表装置支持的版本号码,类似 6.5 则 prop.major 为 6 而prop.minor 为 5)

总的来说有2个CUDA线程池的骨架肯能搭建起来了,而GPU计算的重中之重即并行加速还要都可不可不还可以 进行介绍,不过在加速已经 大伙 还有一件非常重要的事情还要考虑,那可是我大伙 的线程池到底有要都可不可不还可以 加速,也可是我大伙 要输出线程池的运行时间,这人时间大伙 还要使用CUDA提供的有2个Clock函数,要能取得GPU执行单元的频率,可是我下一篇博客我将主要讲解这人函数~希望能给大伙 的学习带来帮助~

参考资料:《深入浅出谈CUDA》

接下来这人函数会调用 runtime API 中 有关初始化CUDA的内容

要写在显示芯片上执行的线程池。在 CUDA 中,在函数前面换成__global__ 表示这人函式是要在显示芯片上执行的,可是我大伙 怎么才能 让我在正常函数已经 换成有2个__global__就行了:

上一次肯能讲过关于CUDA架构的或多或少基础了,这里再稍微复习一下,在 CUDA 的架构下,有2个线程池分为有2个部份:host 端和 device 端。Host 端是处在 CPU 上执行的部份,而 device 端则是在显示芯片上执行的部份。Device 端的线程池又称为 “kernel”。通常 host 端线程池会将数据准备好后,克隆qq好友好友到显卡的内存中,再由显示芯片执行 device 端线程池,完成后再由 host 端线程池将结果从显卡的内存中撤消。

在找到支持 CUDA 1.0 以上的装置已经 ,就要能呼叫 cudaSetDevice 函式,把它设为目还要使用的显卡。

首先大伙 要使用CUDA的RunTime API 可是我 大伙 还要include cuda_runtime.h

这里大伙 先不去并行,可是我单纯地完成GPU计算,可是我大伙 让block = 1,thread = 1,share memory = 0

删改线程池:

要都可不可不还可以 大伙 怎么才能 才能 让这人工作在显卡上完成呢?首先第一件事很显而易见,那些数字要能 倒入内存里了,可是我要克隆qq好友好友到GPU的显存上。下面大伙 就来看一下数据克隆qq好友好友的主次。

写好核函数已经 还要让CUDA执行这人函数。

这次给大伙 介绍了CUDA的初始化和怎么才能 才能 在显卡上运行线程池,即先将数据从内存克隆qq好友好友到显存,再写好运算的核函数,已经 用CUDA调用核函数,完成GPU上的计算,已经 当然无须忘记将结果克隆qq好友好友回内存,释放掉显存。

可是我大伙 先写了有2个随机函数:

该函数会产生一大堆 0 ~ 9 之间的随机数,怎么才能 让大伙 要对大伙 进行立方和操作。

注释肯能写得比较明白了。cudaMalloc 和 cudaMemcpy 的用法和一般的 malloc 及 memcpy 类似,不过 cudaMemcpy 则多出有2个参数,指示克隆qq好友好友内存的方向。在这里肯能是从主内存克隆qq好友好友到显卡内存,可是我使用 cudaMemcpyHostToDevice。肯能是从显卡内存到主内存,则使用cudaMemcpyDeviceToHost。

最后大伙 把结果打印出来就大功告成了: