1. 程式人生 > >CUDA入門2——獲取顯示卡引數

CUDA入門2——獲取顯示卡引數

1 建立CUDA標頭檔案

#ifndef _CUDAINPUT_H_
#define _CUDAINPUT_H_

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

typedef enum {
    CI_OK,
    CI_ERROR
}CI_RESULT;

class input_engine {
public:

    CI_RESULT initCUDA();

private:

    char* err_str;

};

#endif // !_CUDA_H_

1.1 #ifndef/#define/#endif

1.2 建立狀態列舉

typedef enum {
    CI_OK,
    CI_ERROR
}CI_RESULT;

這是和公司影象大神學的程式設計規範,用來簡化程式碼的return,個人感覺很有效果。

1.3 建立介面

CI_RESULT initCUDA();

其具體實現接下來說明。另外這裡有Char*型別,是為具體實現中的printf()使用。stdio.h標頭檔案與printf()有關。

2 建立CUDA檔案

#include "Cuda.cuh"

CI_RESULT input_engine::initCUDA() {
    int
count; cudaGetDeviceCount(&count); if (count <= 0) { sprintf(err_str, "error: there is no cuda capable device;\n"); return CI_ERROR; } cudaDeviceProp prop; //獲得顯示卡狀態 for (int i = 0; i < count; i++) { cudaGetDeviceProperties(&prop, i); if
(prop.major >= 1) { printf("\n********************************************\n"); printf("--> CUDA device %d/%d:\n", i + 1, count); printf(" --> Identfy: %s\n", prop.name); printf(" --> Host Memory: %d\n", prop.canMapHostMemory); printf(" --> Clock Rate: %d\n", prop.clockRate); printf(" --> Compute Mode: %d\n", prop.computeMode); printf(" --> Device OverLap: %d\n", prop.deviceOverlap); printf(" --> Integrated: %d\n", prop.integrated); printf(" --> Kernel Exec Timeout Enabled : %d\n", prop.kernelExecTimeoutEnabled); printf(" --> Max Grid Size: %d*%d*%d\n", prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]); printf(" --> Max Threads Dim: %d*%d*%d\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]); printf(" --> Max Threads per Block: %d\n", prop.maxThreadsPerBlock); printf(" --> Maximum Pitch:%u MB\n", prop.memPitch / 1024 / 1024); printf(" --> Number of Multiprocessors : %d\n", prop.multiProcessorCount); printf(" --> 32bit Refisters Availble per Block:%d\n", prop.regsPerBlock); printf(" --> Shared Memory Acailbale per Block: %d KB\n", prop.sharedMemPerBlock); printf(" --> Alignment Requirement for Textures: %d\n", prop.textureAlignment); printf(" --> Constant memory Acvailable: %u KB\n", prop.totalConstMem / 1024); printf(" --> Global Memory Available:%u MB\n", prop.totalGlobalMem / 1024 / 1024); printf(" --> Warp Size: %d Threads\n", prop.warpSize); printf(" --> Cuda compute capability: %d.%d\n", prop.major, prop.minor); printf("\n********************************************\n"); } if (prop.major < 3) { sprintf(err_str, "error: this program requires at last CUDA capability 3.0;\n"); return CI_ERROR; } if (cudaSetDevice(0) != cudaSuccess) { sprintf(err_str, "error: Can not set CUDA device;\n"); return CI_ERROR; } return CI_OK; } }

2.1 包含標頭檔案

#include "Cuda.cuh"

2.2 介面的具體實現

這裡需要注意的是預設使用第一個顯示卡,如果是多顯示卡的話需要做額外的處理。

3 新增C++檔案

#include "Cuda.cuh"
#include <conio.h>

void printf_usage()
{
    printf("\n**********************************************\n");
    printf("q: quit\n");
    printf("**********************************************\n");
}

int main() {

    input_engine cudainput;
    cudainput.initCUDA();
    printf_usage();

START:
    if ('q' != _getch()) {
        goto START;
    }

    return 0;
}

3.1 包含標頭檔案

#include "Cuda.cuh"
#include <conio.h>

conio.h與下文_getch()方法有關。

3.2 新增程式入口

int main() {
    input_engine cudainput;
    cudainput.initCUDA();

    return 0;
}

這時候如果直接執行程式會出現視窗一閃而過的情況。就需要一種方法讓視窗一直顯示,直到觸發某件事再退出。

3.3 新增顯示視窗方法

START:
    if ('q' != _getch()) {
        goto START;
    }

這裡意思是如果鍵盤按下去的不是Q,就去執行START,結果就是這個方法被迴圈執行,實現顯示視窗的功能。而printf_usage()方法是為了給使用者提示。
至此,執行就可以獲取顯示卡詳細資訊。
這裡寫圖片描述
OK。