CUDA编程接口(一)------一十八般武器------GPU的革命

超详细 CUDA 安装与卸载过程(图文教程) 通过查看,电脑的显卡配置为NVIDIA,Cuda最高版本是12.0,因此Cuda需要安装12.0或12.0以下版本。查看显卡是否是英伟达,如果是英伟达,则可以进行安装Cuda,否则不能安装Cuda。查看显卡大小,可以通过任务管理器查看,到性能中找gpu,发现显卡大小是8G。在dos创建输入命令:nvidia-smi。win+r 进入命令行,输入cmd。 阅读详情

 

CUDA编程接口(一)------一十八般武器
------GPU的革命
序言:所谓一十八般武器,不同的年代又有不同的说法,最早的汉武年间的:矛、镗、刀、戈、槊、鞭、锏、剑、锤、抓、戟、弓、钺、斧、牌、棍、枪、 叉。到三国的:九长: 刀、矛、戟、槊、镗、钺、棍、枪、叉;九短:斧、戈、牌、箭、鞭、剑、锏、锤、抓。再到明清的:弓、弩、枪、刀、剑、矛、盾、斧、钺、戟、黄、锏、挝、殳(棍)、叉、耙头、锦绳套索、白打(拳术 )。 《水浒传》里的:矛、锤、弓、弩、铳、鞭、锏、剑、链、挝、斧、钺、戈、戟、牌、棒、枪、扒。 今天的武术届又有: 刀、枪、剑、戟、斧、钺、钩、叉、鞭、锏、锤、抓、镗、棍、槊、棒、拐、流 星。 400多种古代冷兵器时代的武器,常用的也只有这么多种。也就像我们的API一样,API有无数多个,你自己都可以给自己造几个API出来,常用的,或者就那么多个。要打天下也不能扛着锄头,竹竿干吧。秦国之所以能统一六国,在武器上的统一,提供同一个的型号的武器装备(看秦的历史,就可以发现所有的兵器都是同一型号生产,弓弩上的器件可以互换,从兵马俑坑中找到的剑戟,箭头的尺寸误差很小,都可以互换),也是他能战胜其他六国的很好的基础。
正文:
子曰:工欲善其事,必先利其器。我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器。(如果你想自己开发驱动,自己写开发库- -那我不得不佩服你很有时间,想必也不会有很多人想自己在去实现一个CUDA吧,呵呵,虽然实现一个也不是太难)。书接上回《 CUDA硬件实现分析(二)------规行矩步------GPU的革命》前面我们讲到了一些简单的CUDA的C语言扩展的规则,下面就具体来讲解CUDA给我听哦买提供了多少方便的API函数。在开发CUDA的时候,CDUA也给我们提供了一套完整的API函数。从一开始就在想,怎么把这些枯燥的API函数,或者这CUDA的一十八般武器说得清楚。如果按照中文的翻译的第四章那么讲解,或许晕的人更多,只知道这些是武器,而不知道什么武器是用来干嘛的。从序言看到,十八般武艺所列兵器大同小异,形式和内容却十分丰富。有长器械,短器械;软器械、双器械;有带钩的、带刺的、带尖的、带刀的;有明的、暗的;有攻的、防的;有打的、杀的击的;也有射的、挡的。我们来看CUDA的时候,一看到这么多的API函数,先来给他分一些类,然后才好徐徐道来。
一、    API总结:
1.通用的一些接口,前一章节也有提高过:数学函数,时间函数,同步函数,原子操作;
2.控制Device的函数;就是得到设备信息,管理设备信息的函数。设置那块显卡工作,得到那块显卡的性能。这里有分为driver级别的API和runtime级别的API;有人会问什么是driver级别和runtime级别请看图:
这个图我们在前一章已经看到过了。不会不清楚吧~- -!driver级别的API就是提供驱动级别的API,就像写驱动一样的感觉。Runtime级别的API就是封装了一些Driver级别的API,按照一些常规的方法封装了一些底层的API。其实这里就像我们平时生活中一样,最开始对汽车不熟悉的时候,买一辆车回来能开就ok了;能用熟悉Runtime级别的API就行了。慢慢的,感觉汽车自带的音箱不好,自己就开始买一些原始设备回来改装车;慢慢的感觉整车都有点不爽了,然后慢慢的发现想修改发动机,修改外形……就开始改装车了,这样的工作,就得从Driver级别开始做了,玩得更高级一些的就自己设计图纸,自己来用一些零部件来组装车了。这就是Driver API和Runtime API的关系。Runtime的在开始的用起来一般都比较方便,慢慢的发现如果高层(high-level)的Runtime API用起来不方便,就用底层(low-level)的Driver API来自己做改装的车……
3.内存管理,host的内存,device的内存,global的内存,constant第,shared的,这里会分出来一章单独讲Texture(纹理)内存的使用,说实在的Texture也是内存~非要搞那么神秘,没办法,也只好拿出来单讲……PS:内存管理也分为Runtime级别的API接口,和Device级别的API接口。
4.程序运行控制:像Stream,Event,Context, Module, Execution control这样的咱都把归类到运行管理的。这里也得分清楚有Runtime级别的,也有Driver级别的。
5.好了,这里就剩下OpenGL和Direct3D的接口函数了,其实把,这也是为了方便做图来用的,主要是OpenGL和DX都已经成了图形显示方面的标准,so~显卡也得照顾这两个东东了,要不然显卡自己画……hoho要是真自己再来实现OpenGL或者DX,CUDA就真的会头大了,hoho~~还好就借用现有的图形显示的程序来做就行了。牛顿人家都说是站在“牛头人”(巨人)的肩膀上才能看得更远……咱也不要非自己费那么大的经去做一些无用功。想想吃不饱的时候没看到多少人减肥的,倒是现在吃得好了,减肥的人多了……长胖了去健身房减肥,始终感觉有点怪怪的……拿钱去做无用功,(有用功就是减肥)不过现在也有人在做实验,把多余的这些减肥的人的能量转化为电力……扯远了……提一下:他也有两个层次的API,有Runtime层次的,也有Driver层次的。
好了,差不多就这5个部分的API了。下面我们就来个个讲解CUDA的十八般武器。
二、    API讲解
记得小时候练过几天棍法,现在好像起式都记不起来啦,哈哈,只记得棍要齐眉,剑齐耳朵,不知道错没,hoho。大学的时候一直想给武术队的张锐学九节鞭,不过一直太忙,除了和他练习过几次散打对抗,看他刀+鞭,双刀,枪,剑,九节鞭练习过几次以外,到大学毕业,也都没机会学九节鞭,~现在也就留着那一根九节鞭在身边。看到它就能想起一些朋友吧:)大学毕业也就各奔东西,都不知道他现在在干嘛……
又走神了……想想前面五个部分,下面一部分一部分的讲解:
1. 一些通用的函数:
数学函数,前面章节已经讲了,提一下CUDA 2.0里面添加了一两个新的函数。
时间函数,clock()这个自己去查C的函数库;还有CUDA提供的几个时间函数,用起来也没什么难的,只是说一些,CUDA提供的几个时间函数在计算Device上的运行时间的时候,和CPU上的时间函数比起来还不是那么的完美的准确,所以在做时间数据的时候,最好多取几次求个平均。
同步函数前面章节讲到了, __syncthreads()函数,原子操作函数也就和以前的原子操作函数一个道理,也不用多加解释。不过其实我都觉得这__syncthreads()函数都应该归到程序运行控制部分。
2.Device管理
Runtime和Driver层面的API都提供了设备管理的函数,其实两个层面的API提供的功能都差不多,可以在API的说明中查到他的区别。这里需要指出来的是虽然Host主机上的多线程程序是应该可以同时访问同一块显卡(Device)的,毕竟显卡就是按照PCIE标准插在PCI插槽上的标准设备(也有AGP接口的),这就是一个多线程访问硬件的问题了。So~本来是应该可以的。但是由于CUDA的设计原因,这里的host上的当个多线程的线程每个线程都要执行CUDA kernel的时候,就必须执行在多个Device上面。保证每个线程访问的Device不是同一个。多个线程线程A不能分享线程B在Device上创建的资源。
Runtime API:cudaGetDeviceCount() 和 cudaGetDeviceProperties() 提供了遍历硬件设备,得到某个设备性能参数的功能。
 
int deviceCount;
cudaGetDeviceCount (&deviceCount);
int device;
for (device = 0; device < deviceCount; ++device) {
 cudaDeviceProp deviceProp;
 cudaGetDeviceProperties(&deviceProp, device);
}
cudaSetDevice() 设置某一块 Device作为这个主机host上的某一个运行线程的设备:
cudaSetDevice(device);
这个函数必须要在使用 __global__ 的函数或者 Runtime
的其他的 API调用之前才能生效。 如果没有调用 cudaSetDevice(), device 0 就会被设置为默认的设备,接下里的如果还有 cudaSetDevice() 函数也不会有效果。
 
 
Driver API:
cuDeviceGetCount() 和 cuDeviceGet()  看名字就知道干嘛的~(英语不好的这应该能看明白吧- -!不要被我这个那 国家四级都没过的人BS你哈~!~)
int deviceCount;
cuDeviceGetCount (&deviceCount);
int device;
for (int device = 0; device < deviceCount; ++device) {
 CUdevice cuDevice;
 cuDeviceGet(&cuDevice, device);
 int major, minor;
 cuDeviceComputeCapability(&major, &minor, cuDevice);
}
3.内存管理:
Device上的内存可以被分配成线性的,也可以分配为CUDA的数组形式的。CUDA的内存可以为1维,2维,还有3维(2.0版本)。内存的类型有unsigned8,16或者32位的int,16位(只有driver API可以做到)float,32位的float。这里分配的内存也只能通过kernel里面的函数通过处理纹理的方法来处理。这个地方也是GPU的历史原因了,以前都是处理图像的,所以这里叫纹理。……叫啥都是别人取得名字 - -!在计算机里面不就是内存嘛 - -!
Host的runtime的运行库也提供按照page-locked的内存管理的函数,page-locked的内存要比pageable方式快很多。好的东西往往比较少~page-locked就是很稀少的。如果通过减少分配pageable的内存来分配多的page-locked内存,系统需要的分页内存就少了,这也就会让系统的性能降低了。所以在处理这块的时候要合理。
Runtime API:
使用 cudaMalloc() 或者 cudaMallocPitch() 来分配线性内存,通过 cudaFree()释放内存 .
下面是分配一个大小为 256 float数组的方法:
 
float* devPtr;
cudaMalloc((void**)&devPtr, 256 * sizeof(float));
 
在使用 2D数组的时候最好用cudaMallocPitch()来分配,在guide的第五章在讲到内存之间的调度的时候,就会看到他的好处。下面是一个分配一个大小为width×height 2D float数组的例子:
// host code
float * devPtr;
int pitch;
cudaMallocPitch ((void**)&devPtr, &pitch,
                    width * sizeof(float), height);
myKernel <<<100, 512>>>(devPtr, pitch);
// device code
__global__ void myKernel(float* devPtr, int pitch)
{
 for (int r = 0; r < height; ++r) {
        float* row = (float*)((char*)devPtr + r * pitch);
        for (int c = 0; c < width; ++c) {
              float element = row[c];
        }
 }
}
 
CUDA 的数组方式,需要用 cudaMallocArray()和cudaFreeArray() . cudaMallocArray() 又需要 cudaCreateChannelDesc()来管理,这个其实可以在第guide的第五章里面可以看到,我们后面也会详细的介绍内存的调度和管理,和传统的GPU的内存方式不一样的地方 .
分配 width×height 32位float的CUDA array例子:
cudaChannelFormatDesc channelDesc =
cudaCreateChannelDesc <float>();
cudaArray * cuArray;
cudaMallocArray (&cuArray, &channelDesc, width, height);
 
cudaGetSymbolAddress用来在全局中定位一个数组的位置,然后 cudaGetSymbolSize()来回忆他分配的时候大小----如果有全局编程或者多线程编程经验的,或者用过几个函数同时处理一个数据的经验,都会为了把数据的独立性弄出来,不能让数据和函数耦合太大,一般都不会让函数直接牵扯上数据,只是在函数处理的时候重新定位数据----这地方有点绕~~
下面是一些例子,内存之间的拷贝,回想一下有几种内存~ linear的有两个函数可以分配的,还有CUDA array的内存:
cudaMemcpy2DToArray (cuArray, 0, 0, devPtr, pitch,
                          width * sizeof(float), height,
                          cudaMemcpyDeviceToDevice);
The following code sample copies some host memory array to device memory:
float data[256];
int size = sizeof(data);
float * devPtr;
cudaMalloc ((void**)&devPtr, size);
cudaMemcpy (devPtr, data, size, cudaMemcpyHostToDevice);
从 host上面拷贝内存到device的constant上面 :
__constant__ float constData[256];
float data[256];
cudaMemcpyToSymbol (constData, data, sizeof(data));
 
 
 
 
-#%#$^$^*^&系统int中断:(@$:突然发现已经是早上8点多了 - -!又一夜!@#¥%……!#……
 
Driver API:
cuMemAllocPitch() 被推荐来作为 2D的数组分配函数,会在内存对齐方面做一些check~然后保证在处理数据(像 cuMemcpy2D()这样的拷贝函数 )的时候达到最优的速度。下面就是一个float的width×height的2D的数组,并在循环里面处理的例子: ----(这个地方扩展提两个东东:一个是内存对齐,做程序优化的时候,或者处理网络问题的时候,都会遇到这些问题,内存对齐是一个普遍存在的问题,像SSE这样的编程的时候也是要求内存对齐的,看以后要是有机会以单独讲解内存对齐的问题:)第二个是CUDA的内存访问的问题,就是很多朋友都会在写kernel的时候,搞不明白里面的threadid,block id和传进来的内存的关系,这个地方必须要搞清楚的;内存和线程是CUDA编程必须搞明白的两个概念,不然到时候就会很混乱。其实看看前面的章节,应该能看明白的,不明白就用手画图~要是感觉还是有点不太清楚,也不要担心,接下来的章节会单独把一些难懂的问题更详细的讲解。)
// host code
CUdeviceptr devPtr;
int pitch;
cuMemAllocPitch (&devPtr, &pitch,
                    width * sizeof(float), height, 4);
cuModuleGetFunction (&cuFunction, cuModule, “myKernel”);
cuFuncSetBlockShape (cuFunction, 512, 1, 1);
cuParamSeti (cuFunction, 0, devPtr);
cuParamSetSize (cuFunction, sizeof(devPtr));
cuLaunchGrid (cuFunction, 100, 1);
// device code
__global__ void myKernel(float* devPtr)
{
 for (int r = 0; r < height; ++r) {
        float* row = (float*)((char*)devPtr + r * pitch);
        for (int c = 0; c < width; ++c) {
              float element = row[c];
        }
 }
}
 
cuArrayCreate()和cuArrayDestroy() 来创建和释放 CUDA array类型的数组。下面是一个 width×height 32-bit float类型的CUDA array 分配的例子:
CUDA_ARRAY_DESCRIPTOR desc;
desc .Format = CU_AD_FORMAT_FLOAT;
desc .NumChannels = 1;
desc .Width = width;
desc .Height = height;
CUarray cuArray;
cuArrayCreate (&cuArray, &desc);
 
这个也是几个内存之间拷贝的例子 :
CUDA_MEMCPY2D copyParam;
memset (&copyParam, 0, sizeof(copyParam));
copyParam .dstMemoryType = CU_MEMORYTYPE_ARRAY;
copyParam .dstArray = cuArray;
copyParam .srcMemoryType = CU_MEMORYTYPE_DEVICE;
copyParam .srcDevice = devPtr;
copyParam .srcPitch = pitch;
copyParam .WidthInBytes = width * sizeof(float);
copyParam .Height = height;
cuMemcpy2D (&copyParam);
 
拷贝 host上面的内存到device上面:
float data[256];
int size = sizeof(data);
CUdeviceptr devPtr;
cuMemAlloc (&devPtr, size);
cuMemcpyHtoD (devPtr, data, size);
 
本来想一次把下面的 4,5点也讲了~但是如果一下讲出来~lz帖子太长了~~这就不好了~~呵呵,实在的,看第四章的中文翻译的时候,就看了前面几个就不想看了~帖子不能老长老长的又不吸引人- -!hoho~ 所以后面的4,5就在下贴里面发了~~看了这么多也比较累的~好好的休闲一下~你还会发现出了4,5部分,还少了一个部分,那就是CUDA自己的函数,怎么定义,有device的,有global的,这个又有怎么区分啦~且听下回讲解。Hoho
 
ps:熬夜不好~熬夜很伤身……
 
有的时候,我们经常会用旧的东东来和新的东东比较,就像 C和C++都不知道争论多少年了。其实很多时候我到觉得是没必要的争论,除非你是做C或者C++本身开发的。就像新的硬件不停的变化,以前的概念或者今天就不能用了,有的时候,我们关心架构在这个之上的程序开发就够了,没有太多的必要去问茴香豆的茴有几种写法。有的时候看到论坛里面的争论的时候,很多都不太清楚问题的也参加到争论里面,感觉就是明白事的没有几个,倒是起哄的不少 - -!人家说当局者迷,旁观者清,我看现在很多时候倒是当局者清,旁观者瞎起哄- -!呵呵,好像合乎了现在很多选秀节目的心理哈,起哄的人越多,人家的节目越红,哈哈~----扯远了……
 
Ps2:在学习API的时候,最好的方法就是多实验,多尝试API的性能,就像练习武术中的器械一样,经常用才会精通的,才能在这个基础上想出新的招式。就像有人在优快云论坛问,怎么才能弄好ACM比赛,看到像刘汝佳写的《算法艺术与信息学竞赛》的书,都是一些方法,没有代码,就觉得很不解,就像问用什么代码来实现。我的回答就是:阅尽天下A×,心中自然无码。多做代码的练习,找一本数据结构的书,对照上面的代码都自己实现一遍,找一个代码练习的书,自己都重新写一遍。要不然就把像MSDN这样的介绍API的资料上的Demo能实现多少都去实现以下,呵呵。其实学习怎么编码都是一些基础工作。最重要的到最后都是算法的实现。其实到最后你会发现写程序就是数组的处理,就是字符串的处理……仅此而已~。所以不要小看了C语言那些书上的小程序例子,不要小看了输出(**)星星这样的例子,实际程序中很多时候都是处理这些星星~hoho~不要一上来就想去写什么游戏,写什么网络软件~先把字符串处理好了,就nb了,真的~你看ACM的题目,topcoder的题目,几乎都是字符串处理- -!哈哈。多实践,多去做一些demo例子。到真正用的时候就会觉得手到擒来,怎么用怎么顺手了。
还是那句话:约尽天下 A×,心中自然无码。
再多 ps一句:上次和刘汝佳聊天,他准备在新版的书中用java来添加一些代码实现讲解,哈哈~hoho
GPU基本介绍 基本概念: GPU: Graphic Processing Unit;图形处理单元; GPGPU: General Purpose computations on GPU;通用计算图形处理单元; CPU与GPU的相同点: (1)都是计算机体系结构中的重要组成部分; (2)都是超大规模集成电路元件; (3)都能够完成浮点运能功能; CPU与GPU的不同之处: (1)GPU的设计目 阅读详情

相关推荐

cuda、cudann、nvcc、pytorch、torchvision

一、定义 1.1、什么是CUDA CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 1.2、什么是CUDNN NVIDIA CUDNN是用于深度神经网络的GPU加速库。 二、查看版本 2.1 查看显卡驱动 nvidia-smi Driver Version: 410.104 CUDA Version: 10.0 表明显卡驱

北落师门XY的博客 7365

CUDA简介, 配置和运行第一个CUDA程序(Windows和Linux)

CUDA保姆级配置教程和运行测试

qq_74083422的博客 3万+

QOpenGL入门教程(二)—— 第一个QOpenGLWidget程序

终于到了实际操作的环节了,这一章我们要做的是: 创建OpenGL窗口 创建并编写着色器程序 为着色器程序装配顶点数据 启动渲染管线进行绘图 第一步:创建新项目 首先,我们使用Qt创建一个常规的QWidget项目,建议不要勾选ui设计器(个人习惯,笔者不太习惯于使用ui来设计) 第二步:创建QOpenGLWidget并实现三个虚函数 QOpenGLWidget Qt5.4之前,Qt可以通过一个QGLWidget类来创建OpenGL窗口,但由于opengl的发展,在5.4版本的时候,Qt提供

ItaLink 1万+

CUDA是什么?

计算正在从CPU"中央处理"向CPU与GPU"协同处理的方向发展。为了实现这一新型计算模式,英伟达发明了英伟达™ CUDA™并行计算架构。

Florence23的博客 1万+

安装m_map以及用matlab绘制高精度海岸线地图

#如何用matlab绘制高精度海岸线地图

qq_38512775的博客 1万+

传输线的特征阻抗

信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输入端或输出端处于阻抗匹配状态,简称为阻抗匹配。否则,便称为阻抗失配。有时也直接叫做匹配或失配。指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗。- 对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;

学海无涯的专栏 4464

(CUDA 编程5).CUDA编程接口(一)------一十八般武器

(CUDA 编程5).CUDA编程接口(一)------一十八般武器 作者:赵开勇 来源:http://www.hpctech.com/2009/0818/203.html 子曰:工欲善其事,必先利其器。我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器 (CUDA 编程5) CUDA编程接口(一)-

dmjlzygx的专栏 3922

无线Mesh组网全攻略:从原理、部署到调优与排障

对于布线困难的大户型、复式楼或园区,传统的无线中继往往面临带宽减半和链路不稳定的问题。无线Mesh网络通过多跳转发与自组织路由,让每个节点无需网线即可协作扩展覆盖,并依靠动态路径选择实现自愈。其核心技术涉及802.11s、HWMP路由协议,以及802.11k/v/r协同的无缝漫游,能有效提升终端切换体验。在实际部署中,设备选型、回程频段规划与布点位置直接决定网络质量。围绕无线Mesh的组网原理、设备选型、配置调优与故障排查,提供一套工程实践参考,帮助用户在复杂环境下构建稳定高效的无缝覆盖。

weixin_34098209的博客 271

CUDA编程接口(二)------一十八般武器------GPU的革命

CUDA编程接口(二)------一十八般武器------GPU的革命4. 程序运行控制:像Stream,Event,Context, Module, Execution control这样的咱都把归类到运行管理的。这里也得分清楚有Runtime级别的,也有Driver级别的。Stream:如果了解AGP时代的显卡,就知道在Device和Host之间进行数据交换的时候有作为中转数据的部

OpenHero 开勇 7729

反序列化漏洞详解

目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用 八、反序列化漏洞的利用 1.__destruct()函数 2.__wakeup() 3.toString() ​九、反序列化漏洞的防御 一、什么是序列化和反序列化 序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串.

LJH1999ZN的博客 3万+

【YOLOv8系列】在Windows上离线搭建YOLOv8运行环境

我们都知道,通过 pip安装YOLOv8是非常方便的,但是有时候网络环境受到限制,比如公司的工作站(无法连接网络)或者机房的教学机器等等,只能通过离线的方式安装YOLOv8;今天就来记录一下离线搭建YOLOv8运行环境的过程。并记录了遇到的问题及解决过程。

AnChenliang_1002的博客 2004

《GPU的革命》文章整理

整理几年前写的文章,或许对初学CUDA编程的朋友有帮助:CUDA 线程执行模型分析(一)招兵------ GPU的革命CUDA 线程执行模型分析(二)大军未动粮草先行------GPU的革命CUDA硬件实现分析(一)------安营扎寨-----GPU的革命CUDA硬件实现分析(二)------规行矩步------GPU的革命CUDA编程接口(一)------一十八般武器------GPU的革命C

OpenHero 开勇 1万+

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

【CUDA开发】CUDA编程接口(一)------一十八般武器

子曰:工欲善其事,必先利其器。我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器。(如果你想自己开发驱动,自己写开发库- -那我不得不佩服你很有时间,想必也不会有很多人想自己在去实现一个CUDA吧,呵呵,虽然实现一个也不是太难)。前面我们讲到了一些简单的CUDA的C语言扩展的规则,下面就具体来讲解CUDA给

ZhangPY的专栏 2814

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

(CUDA 编程6).CUDA编程接口(二)------一十八般武器

(CUDA 编程6).CUDA编程接口(二)------一十八般武器 作者:赵开勇 来源:http://www.hpctech.com/2009/0818/204.html (CUDA 编程6)CUDA编程接口(二)------一十八般武器 ------GPU的革命 4. 程序运行控制:像Stream,Event,Context, Module, Execution control

dmjlzygx的专栏 1131

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GPU的革命

CUDA 线程执行模型分析(一)招兵------ GPU的革命 CUDA 线程执行模型分析(二)大军未动粮草先行------GPU的革命 CUDA硬件实现分析(一)------安营扎寨-----GPU的革命 CUDA硬件实现分析(二)------规行矩步------GPU的革命 CUDA编程接口(一)------一十八般武器------GPU的革命 CUDA编程接口(二)------...

weixin_30788731的博客 121

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

CUDA编程接口入门

子曰:工欲善其事,必先利其器。我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器。(如果你想自己开发驱动,自己写开发库- -那我不得不佩...

cllm33533的博客 155
上一篇: 推荐几本书---GPU,并行算法,多核
下一篇: CUDA编程接口(二)------一十八般武器------GPU的革命
OpenHero
博客等级 码龄23年 2276粉丝 226原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值