cuda是什么意思

更新时间:2023-04-18 14:22:00 阅读: 评论:0


2023年4月18日发(作者:泗门镇)CUDA常见函数(⼀)(⼩⽩⼊门)
CUDA常见函数(⼩⽩⼊门)
⽰例代码0VS⾃带
初始定义
程序⾸先定义了⼀个函数addWithCuda,它是调⽤GPU运算的⼊⼝函数,返回类型是cudaError_t。
cudaError_t是⼀个枚举类型,可以作为⼏乎所有CUDA函数的返回类型,⽤来检测函数执⾏期间发⽣的不同类型的错误,⼀共有80多个错
误类型,可以在driver_types.h头⽂件中查看每⼀个整型对应的错误类型,如果返回0,代表执⾏成功。
核函数
函数addKernel在最前有⼀个修饰符“global”,这个修饰符告诉编译器,被修饰的函数应该编译为在GPU⽽不是在CPU上运⾏,所以这个
函数将被交给编译设备代码的编译器——NVCC编译器来处理,其他普通的函数或语句将交给主机编译器处理。
这⾥“设备”的概念可以理解为GPU和其显存组成的运算单元,“主机”可以理解为CPU和系统内存组成的运算单元。在GPU上执⾏的函
数称为核函数。橡皮的英文怎么读
注:关于threadIdx.x的说明。
CUDA中的线程(thread)是设备中并⾏房屋租赁税费 运算结构中的最⼩单位,类似于主机中的线程的概念,thre洋葱炒菜 ad可以以⼀维、⼆维、三维的形
式组织在⼀起,threadIdx.x表⽰的是thread在x⽅向的索引号,还可能存在thread在y和z⽅向的索引号threadIdx.y和threadIdx.z。
⼀维、⼆维或三维的thread组成⼀个线程块(Block),⼀维、⼆维或三维的线程块(Block)组合成⼀个线程块⽹格(Grid),线程
块⽹格(Grid)可以是⼀维或⼆维的。通过⽹格块(Grid)->线程块(Block)->线程(thread)的 顺序可以定位到每⼀个并且唯⼀
的线程。
addKernel函数会被GPU上的多个线程同时执⾏⼀次,线程间彼此没有通信,相互独⽴。到底会有多少个线程来分别执⾏核函数,是
在“<<< >>>”符号⾥定义的。“<<< >>>”表⽰运⾏时配置符号,在本程序中的定义是<<<1,size>>>,表⽰分配了⼀个线程块(Block),
每个线程块有分配了size个线程,“<<<>>>”中的 参数并不是传递给设备代码的参数,⽽是定义主机代码运⾏时如何启动设备代码。以上定
义的这些线程都是⼀个维度上的,可以通过thredaIdx.x来获取执⾏当前计算任务的线程的ID号。
其他函数
cudaSetDevice函数⽤来设置要在哪个GPU上执⾏,如果只有⼀个GPU,设置为cudaSetDevice(0);
cudaGetLastError函数⽤于返回最新的⼀个运⾏时调⽤错误,对于任何CUDA错误,都可以通过函数cudaGetErrorString函数来获取错
误的详细信息。
cudaDeviceSynchronize函数提供了⼀个阻塞,⽤于等待所有的线程都执⾏完各⾃的计算任务,然后继续往下执⾏。
cudaFree函数⽤于释放申请的显存空间。
cudaDeviceRet函数⽤于释放所有申请的显存空公司年度工作总结 间和重置设备状态;
⽰例代码1:传递参数

#include
#include "book.h"
__global__ void add( int a, int b, int *c ) {
*c = a + b;
}
int main( void ) {
int c;
int *dev_c;
HANDLE_ERROR( cudaMalloc( (void**)&dev_c, sizeof(int) ) ); /* */
第⼀个参数是指针,只想⽤于保存新分配内存地址的变量,第⼆个参数是分配内存⼤⼩
/* void* */
返回值不是指针,且返回类型为
add<<<1,1>>>( 2, 7, dev_c ); // <<<>>>Blocksize
表⽰运⾏时配置符号,第⼀个参数表⽰只分配⼀个线程组(⼜称线程块、),晴的词语 第⼆个参数表⽰每个线程组有
个线程(
Thre心愿墙 ad
HANDLE_ERROE( cudaMemcpy( &c,
dev_c,
sizeof(int)
cudaMemcpyDeviceToHost ) );
print( "2 + 7 = %dn", c );
cudaFree( dev_c );

return 0;
}
cudaMalloc
memory allocate 动态分配内存
malloc
例:
int *p = (int *)malloc(sizeof(int))
int* p代表⼀个以int类型地址为内容的指针变量,p这个变量占4个字节(某些计算机),这个p变量是静态分配的⼀个变量。
malloc函数返回开辟空间的⾸地址,加(int *)的⽬的是让计算机知道,如何去划分这个开辟的空间,因为char、int 、long这些类型的字节
⼤⼩是不⼀样的,我们知道了⾸地址,还要知道是以⼏个字节为单元。
cudaFree
需要使⽤此函数释放cudaMalloc函数分配的内存。
cudaMemcpy
在主机代码中调⽤cudaMemcpy()来访问设备上的内存。
cudaMemcpy(⽬的地, 复制对象, 复制区域长度, 设备到主机/主机到设备)
⽰例代码1中,cudaMemcpy()中最后⼀个参数为cudaMemcpyDeviceToHost,意为运⾏时源指针为设备指针,⽬标指针为主机指针。
Memcpy
如果源指针和⽬标指针都在主机上,可直接调⽤此函数。
例:
void *memcpy(void *dest, const void *src,unsigned int count);
dest - ⽬的
src - 源
count - 复制字节数
由src所指内存区域复制count个字节到dest所指内存区域。
返回指向dest的指针。

当dest <= src-count 或dest >= src+count时,不会产⽣覆盖问题,即源数据不会被更改。
若不在以上范围内,则源数据会被更改。
⽰例代码2:查询设备
#include "../common/book.h"
int main void( void ) {
cudaDeviceProp prop;
int count;
HANDLE_ERROR( cudaGetDevicecount( &count ) );
for (int i=0; i< count; i++){
HANDLE_ERROR( cudaGetDeviceProperties( &prop, i ) );
//
对设备属性执⾏某些操作
}
}
int count;
HANDLE_ERROR( cudaGetDeviceCount( &count ) );/* CUDA */
获取设备的数量。
cudaGetDeviceCount
在调⽤此函数后,可以对每个设备进⾏迭代,并查询各个设备相关信息。
CUDA运⾏时将返回⼀个cudaDeviceProp类型的结构,其中包含了设备的相关属性。
参考《NVIDIA CUDA Programming Guide》
#include
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include
using namespace std;
int main()
{
cudaDeviceProp deviceProp;
int deviceCount;
cudaError_t cudaError;
cudaError = cudaGetDeviceCount(&deviceCount);
for (int i = 0; i < deviceCount; i++)
{
cudaError = cudaGetDeviceProperties(&deviceProp, i);
cout << "设备 " << i + 1 << " 的主要属性: " << endl;
cout << "设备显卡型号: " << deviceProp.name << endl;
cout << "设备上⼀个线程束(Warp)中包含的线程数量: " << deviceProp.warpSize << endl;
cout << "多维线程块(Block)数组中,每⼀维可包含的最⼤线程(Thread)数量: " << deviceProp.maxThreadsDim[3] << endl;
cout << "⼀个线程格(Grid)中,每⼀维可以包含线程块(Block)数量: " << deviceProp.maxGridSize[3] << endl;
cout << "设备全局内存总量(以MB为单位): " << deviceProp.totalGlobalMem / 1024 / 1024 << endl;
cout << "设备上⼀个线程块(Block)中可⽤的最⼤共享内存(以KB为单位): " << deviceProp.sharedMemPerBlock / 1024 << endl;
cout << "设备上⼀个线程块(Block)种可⽤的32位寄存器数量: " << deviceProp.regsPerBlock << endl;
cout << "设备上⼀个线程块(Block)可包含的最⼤线程数量: " << deviceProp.maxThreadsPerBlock << endl;
cout << "设备的计算功能集(Compute Capability)的版本号: " << deviceProp.major << "." << deviceProp.minor << endl;
cout << "设备上多处理器的数量: " << deviceProp.multiProcessorCount << endl;
}
getchar();
return 0;
}

其他
快速傅⾥叶变换(C++
floor
floor函数,其功能是“向下取整”,或者说“向下舍⼊”、“向零取舍”,即取不⼤于x的最⼤整数
ceil
double ceil(double x);
float ceil ( float value )
功 能: 返回⼤于或者等于指定表达式的最⼩整数,value 如果有⼩数部分则进⼀位。
头⽂件
math.h
gettimeofdaywindows下的实现)

#include
#ifdef WIN32
#include
#el
#include
#endif
#ifdef WIN32
int gettimeofday(struct timeval *tp, v芹菜种植方法 oid *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_c = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_c = clock;
tp->tv_uc = wtm.wMilliconds * 1000;
return (0);
}
#endif


本文发布于:2023-04-18 14:22:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/835804.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:亓姓的由来
下一篇:区角活动教案
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图