Ubuntu 12.04 下 CUDA 编程


关于Ubuntu 12.04 下 CUDA5.5 的安装请参看如下链接 Ubuntu 12.04 安装 CUDA-5.5

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

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

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

  • 获取 CUDA 设备数
  • 获取 CUDA 设备属性
  • 设置 CUDA 设备

函数如下:

/* *******************************************************************
##### 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 <stdio.h>
#include <cuda_runtime.h>

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 —— 返回具有计算能力的设备的数量

Ubuntu 11.10 上安装CUDA开发环境

Fedora 15系统下配置CUDA环境

Ubuntu 11.04 安装 NVIDIA CUDA 4.0 RC2

Linux Mint 13/Ubuntu 12.04 配置CUDA 4.2 & OpenCV 2.4.2 方法

函数原型: 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

定义设备计算能力的主要修订号和次要修订号;

clockRate

以千赫为单位的时钟频率;

textureAlignment

对齐要求;与textureAlignment字节对齐的纹理基址无需对纹理取样应用偏移;

deviceOverlap

如果设备可在主机和设备之间并发复制存储器,同时又能执行内核,则此值为 1;否则此值为 0;

multiProcessorCount

设备上多处理器的数量。

cudaSetDevice —— 设置设备以供GPU执行使用

函数原型: cudaError_t cudaSetDevice(int dev)

函数说明: 将dev记录为活动主线程将执行设备码的设备。

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

 

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 下一页
【内容导航】
第1页:GPU 运行程序(1) 第2页:GPU 运行程序(2)
第3页:GPU 运行程序(3) 第4页:GPU 程序加速(1)
第5页:GPU 程序加速(2) 第6页:GPU 程序加速(3)
第7页:GPU 程序加速(4)

相关内容