# cuda_lib_test **Repository Path**: oxy/cuda_lib_test ## Basic Information - **Project Name**: cuda_lib_test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-24 - **Last Updated**: 2021-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用CMake构建DLL 项目使用Cmake工具构建和Clion IDE 编写代码 。运行测试环境win10 , cuda11.4 # 概要 1. 如何构建cuda项目 2. 如何构建dll库 3. 如何调用dll ## CMakeLists.txt简要说明 ```cmake cmake_minimum_required(VERSION 3.19) //最低版本要求 project(cuda_demo5 CUDA) //指定项目名称和所使用语言 , 这里项目名:cuda_demo5 语言:CUDA set(CMAKE_CUDA_STANDARD 14) //指定cuda版本 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) //构建dll关键所在 include_directories(.) //包含头文件 include_directories(common/inc) add_subdirectory(test_lib) //添加子项目, 就是需要构建的dll库, 这里是test_lib.all test_lib.lib aux_source_directory(. SRC) //获取当前文件夹下所有源文件名且赋值给SRC add_executable(${PROJECT_NAME} ${SRC}) //构建.exe文件 , 这里是cuda_demo5.exe target_link_libraries(${PROJECT_NAME} PUBLIC test_lib) //指定cuda_demo5.exe需要连接的dll(test_lib.all test_lib.lib) set_target_properties( ${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) //使用cuda编译 install(TARGETS ${PROJECT_NAME} test_lib RUNTIME DESTINATION ${CMAKE_BINARY_DIR} LIBRARY DESTINATION ${CMAKE_BINARY_DIR} ARCHIVE DESTINATION ${CMAKE_BINARY_DIR}) //指定安装目录 ``` ## 如何构建cuda项目 project(cuda_demo5 CUDA) 必须指定为cuda语言 set(CMAKE_CUDA_STANDARD 14) //指定cuda版本 set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) 指定使用cuda编译 ## 如何构建dll库 test_lib的CMakeLists.txt文件 ```cmake cmake_minimum_required(VERSION 3.19) project(test_lib CUDA) set(CMAKE_CUDA_STANDARD 14) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) include_directories(.) include_directories(../common/inc) aux_source_directory(. SRC) add_library(${PROJECT_NAME} SHARED ${SRC}) #add_executable(cuda_demo5 main.cu) set_target_properties( ${PROJECT_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON) ``` set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) 把宏CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 设置为ON CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 来导出所有函数符号,通过.def文件来说明导出函数列表, .def是自动生成的。如果 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 设置为OFF则不会导出所有函数符号, 可以在代码中使用__declspec(dllexport)修饰某些需要被导出的函数。 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 有利于代码跨平台移植 ## 如何调用dll test_lib包含有头文件test_lib.cuh和定义文件test_lib.cu test_lib.cuh ```c++ // // Created by ozcom on 2021/7/24. // #ifndef CUDA_DEMO5_TEST_LIB_CUH #define CUDA_DEMO5_TEST_LIB_CUH __global__ void matrix_mul_gpu(int *M, int* N, int* P, int width); #endif //CUDA_DEMO5_TEST_LIB_CUH ``` test_lib.cu ```c++ // // Created by ozcom on 2021/7/24. // #include "test_lib.cuh" __global__ void matrix_mul_gpu(int *M, int* N, int* P, int width) { int i = threadIdx.x + blockDim.x * blockIdx.x; int j = threadIdx.y + blockDim.y * blockIdx.y; int sum = 0; for(int k=0;k #include #include "cuda.h" #include "helper_functions.h" #include "helper_cuda.h" #include #include "test_lib/test_lib.cuh" #define Row 1024 #define Col 1024 int main() { int *A = (int *)malloc(sizeof(int) * Row * Col); int *B = (int *)malloc(sizeof(int) * Row * Col); int *C = (int *)malloc(sizeof(int) * Row * Col); //malloc device memory int *d_dataA, *d_dataB, *d_dataC; cudaMalloc((void**)&d_dataA, sizeof(int) *Row*Col); cudaMalloc((void**)&d_dataB, sizeof(int) *Row*Col); cudaMalloc((void**)&d_dataC, sizeof(int) *Row*Col); //set value for (int i = 0; i < Row*Col; i++) { A[i] = 90; B[i] = 10; } cudaMemcpy(d_dataA, A, sizeof(int) * Row * Col, cudaMemcpyHostToDevice); cudaMemcpy(d_dataB, B, sizeof(int) * Row * Col, cudaMemcpyHostToDevice); dim3 threadPerBlock(16, 16); dim3 blockNumber((Col+threadPerBlock.x-1)/ threadPerBlock.x, (Row+threadPerBlock.y-1)/ threadPerBlock.y ); printf("Block(%d,%d) Grid(%d,%d).\n", threadPerBlock.x, threadPerBlock.y, blockNumber.x, blockNumber.y); matrix_mul_gpu <<>> (d_dataA, d_dataB, d_dataC, Col); //拷贝计算数据-一级数据指针 cudaMemcpy(C, d_dataC, sizeof(int) * Row * Col, cudaMemcpyDeviceToHost); //释放内存 free(A); free(B); free(C); cudaFree(d_dataA); cudaFree(d_dataB); cudaFree(d_dataC); return 0; } ``` mian.cu需要包含test_lib.cuh文件,这要就可以愉快的使用了。