CUDA入門2——獲取顯示卡引數
阿新 • • 發佈:2019-02-03
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。