歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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: [email protected]
##### 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開發環境 http://www.linuxidc.com/Linux/2012-04/58913.htm

Fedora 15系統下配置CUDA環境 http://www.linuxidc.com/Linux/2011-12/49874.htm

Ubuntu 11.04 安裝 NVIDIA CUDA 4.0 RC2 http://www.linuxidc.com/Linux/2011-10/46304.htm

Linux Mint 13/Ubuntu 12.04 配置CUDA 4.2 & OpenCV 2.4.2 方法 http://www.linuxidc.com/Linux/2013-10/91102.htm

函數原型: 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,注意,如果之前是異步啟動,該函數可能返回錯誤碼。

 

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103056p2.htm

Copyright © Linux教程網 All Rights Reserved