设为首页 加入收藏

TOP

Ubuntu 12.04 下 CUDA 编程(一)
2014-11-23 22:59:18 来源: 作者: 【 】 浏览:30
Tags:Ubuntu 12.04 CUDA 编程

1、使用 Runtime API 创建第一个 CUDA 程序


CUDA 初始化函数由于是使用 Runtime API, 所以在文件开头要加入 cuda_runtime.h 头文件。


初始化函数包括一下几个步骤:


函数如下:


/* *******************************************************************
##### File Name: first_cuda.cu
##### File Func: initial CUDA device and print device prop
##### Author: Caijinping
##### E-mail: caijinping220@gmail.com
##### Create Time: 2014-4-21
* ********************************************************************/


#include
#include


void printDeviceProp(const cudaDeviceProp &prop)
{
printf("Device Name : %s.\n", prop.name);
printf("totalGlobalMem : %d.\n", prop.totalGlobalMem);
printf("sharedMemPerBlock : %d.\n", prop.sharedMemPerBlock);
printf("regsPerBlock : %d.\n", prop.regsPerBlock);
printf("warpSize : %d.\n", prop.warpSize);
printf("memPitch : %d.\n", prop.memPitch);
printf("maxThreadsPerBlock : %d.\n", prop.maxThreadsPerBlock);
printf("maxThreadsDim[0 - 2] : %d %d %d.\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
printf("maxGridSize[0 - 2] : %d %d %d.\n", prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);
printf("totalConstMem : %d.\n", prop.totalConstMem);
printf("major.minor : %d.%d.\n", prop.major, prop.minor);
printf("clockRate : %d.\n", prop.clockRate);
printf("textureAlignment : %d.\n", prop.textureAlignment);
printf("deviceOverlap : %d.\n", prop.deviceOverlap);
printf("multiProcessorCount : %d.\n", prop.multiProcessorCount);
}


bool InitCUDA()
{
//used to count the device numbers
int count;


// get the cuda device count
cudaGetDeviceCount(&count);
if (count == 0) {
fprintf(stderr, "There is no device.\n");
return false;
}


// find the device >= 1.X
int i;
for (i = 0; i < count; ++i) {
cudaDeviceProp prop;
if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
if (prop.major >= 1) {
printDeviceProp(prop);
break;
}
}
}


// if can't find the device
if (i == count) {
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}


// set cuda device
cudaSetDevice(i);


return true;
}


int main(int argc, char const *argv[])
{
if (InitCUDA()) {
printf("CUDA initialized.\n");
}


return 0;
}


Runtime API 函数解析cudaGetDeviceCount —— 返回具有计算能力的设备的数量


函数原型: cudaError_t cudaGetDeviceCount( int* count )


函数说明: 以*count形式返回可用于执行的计算能力大于等于1.0的设备数量。如果不存在此类设备,将返回1


返回值: cudaSuccess,注意,如果之前是异步启动,该函数可能返回错误码。


cudaGetDeviceProperties —— 返回关于计算设备的信息


函数原型: cudaError_t cudaGetDeviceProperties( struct cudaDeviceProp* prop,int dev )


函数说明: 以*prop形式返回设备dev的属性。


返回值: cudaSuccess、cudaErrorInvalidDevice,注意,如果之前是异步启动,该函数可能返回错误码。


cudaDeviceProp 结构定义如下:


struct cudaDeviceProp {
char name [256];
size_t totalGlobalMem;
size_t sharedMemPerBlock;
int regsPerBlock;
int warpSize;
size_t memPitch;
int maxThreadsPerBlock;
int maxThreadsDim [3];
int maxGridSize [3];
size_t totalConstMem;
int major;
int minor;
int clockRate;
size_t textureAlignment;
int deviceOverlap;
int multiProcessorCount;
}


其中:


name


用于标识设备的ASCII字符串;


totalGlobalMem


设备上可用的全局存储器的总量,以字节为单位;


sharedMemPerBlock


线程块可以使用的共享存储器的最大值,以字节为单位;多处理器上的所有线程块可以同时共享这些存储器;


regsPerBlock


线程块可以使用的32位寄存器的最大值;多处理器上的所有线程块可以同时共享这些寄存器;


warpSize


按线程计算的warp块大小;


memPitch


允许通过cudaMallocPitch()为包含存储器区域的存储器复制函数分配的最大间距(pitch),以字节为单位;


maxThreadsPerBlock


每个块中的最大线程数


maxThreadsDim[3]


块各个维度的最大值:


maxGridSize[3]


网格各个维度的最大值;


totalConstMem


设备上可用的不变存储器总量,以字节为单位;


major,minor


定义设备计算能力的

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HTML5中的标记方法 下一篇Java枚举在Android项目应用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: