CUDA入门2——获取显卡参数

来源:互联网 发布:linux创建新用户并授权 编辑:程序博客网 时间:2024/06/05 16:52

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

这是为了防止该头文件被重复引用,具体内容可见《#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。

原创粉丝点击