From 6051ece39ee6fd1402784dc1abb29bd2159cbbf5 Mon Sep 17 00:00:00 2001 From: Even Bell <130771607+2000e@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:34:24 +0800 Subject: [PATCH] init --- .gitignore | 1 + .vscode/extensions.json | 13 +++++ .vscode/settings.json | 21 +++++++ CMakeLists.txt | 31 +++++++++++ README.md | 1 + include/main_ext.h | 3 + src/external/main_ext.cpp | 6 ++ src/test_add.cpp | 8 +++ src/test_cuda.cu | 112 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 196 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 include/main_ext.h create mode 100644 src/external/main_ext.cpp create mode 100644 src/test_add.cpp create mode 100644 src/test_cuda.cu diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c795b05 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..74763f2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + "recommendations": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools", + "josetr.cmake-language-support-vscode", + "nvidia.nsight-vscode-edition", + "IBM.output-colorizer", + "christian-kohler.path-intellisense", + ], + "unwantedRecommendations": [ + "llvm-vs-code-extensions.vscode-clangd" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b4653ab --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "cmake.debugConfig": { + "args": [ + // 程序运行参数 + ] + }, + "cmake.configureSettings": {}, + "cmake.outputLogEncoding": "utf8bom", + "cmake.generator": "Ninja", + // "cmake.enableLanguageServices": false, + "[cpp]": { + "files.encoding": "utf8bom" + }, + "[cuda-cpp]": { + "files.encoding": "utf8bom", + }, + "files.associations": { + "iostream": "cpp", + "chrono": "cpp" + }, +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..688baf3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.20) +project("WIN_CUDA_DEV") + +if(NOT WIN32) + message(FATAL_ERROR "This project only supports Windows platform") +endif() + +# 语法标准 +enable_language(CXX CUDA) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CUDA_STANDARD 17) + +# 显卡架构优化,详见 https://developer.nvidia.com/cuda-gpus +set(CMAKE_CUDA_ARCHITECTURES 86) + +# 查找CUDA库 +find_package(CUDAToolkit REQUIRED) + +# 头文件索引 +include_directories("./include") + +# 添加可执行文件 test_add.exe +add_executable(test_add + "./src/test_add.cpp" + "./src/external/main_ext.cpp" +) + +# cuda-test.exe +add_executable(test_cuda src/test_cuda.cu) +target_link_libraries(test_cuda CUDA::cudart) +set_target_properties(test_cuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..87d489d --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Windows平台 VSCode CMake CUDA 开发 \ No newline at end of file diff --git a/include/main_ext.h b/include/main_ext.h new file mode 100644 index 0000000..f4382b1 --- /dev/null +++ b/include/main_ext.h @@ -0,0 +1,3 @@ +#pragma once + +int add(int,int); \ No newline at end of file diff --git a/src/external/main_ext.cpp b/src/external/main_ext.cpp new file mode 100644 index 0000000..ce69897 --- /dev/null +++ b/src/external/main_ext.cpp @@ -0,0 +1,6 @@ +#include + +auto add(int x, int y) -> int +{ + return x + y; +} \ No newline at end of file diff --git a/src/test_add.cpp b/src/test_add.cpp new file mode 100644 index 0000000..d064801 --- /dev/null +++ b/src/test_add.cpp @@ -0,0 +1,8 @@ +#include +#include +int main() +{ + std::cout << "Windows平台 VSCode + CMake + CUDA 开发工具集" << std::endl; + std::cout << " 1 + 2 = " << add(1, 2) << std::endl; + return 0; +} \ No newline at end of file diff --git a/src/test_cuda.cu b/src/test_cuda.cu new file mode 100644 index 0000000..d956435 --- /dev/null +++ b/src/test_cuda.cu @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include + +// CUDA核函数:向量加法 +__global__ void vectorAdd(const float *A, const float *B, float *C, int N) +{ + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i < N) + { + C[i] = A[i] + B[i]; + } +} + +// 检查CUDA错误 +#define CUDA_CHECK(call) \ + do \ + { \ + cudaError_t error = call; \ + if (error != cudaSuccess) \ + { \ + std::cerr << "CUDA error at " << __FILE__ << ":" << __LINE__ << " - " << cudaGetErrorString(error) << std::endl; \ + exit(1); \ + } \ + } while (0) + +int main() +{ + // 向量大小 + const int N = 1024 * 1024; + const size_t size = N * sizeof(float); + + // 在主机上分配内存 + std::vector h_A(N); + std::vector h_B(N); + std::vector h_C(N); + + // 初始化向量 + for (int i = 0; i < N; i++) + { + h_A[i] = static_cast(i); + h_B[i] = static_cast(i * 2); + } + + // 在设备上分配内存 + float *d_A = nullptr; + float *d_B = nullptr; + float *d_C = nullptr; + + CUDA_CHECK(cudaMalloc(&d_A, size)); + CUDA_CHECK(cudaMalloc(&d_B, size)); + CUDA_CHECK(cudaMalloc(&d_C, size)); + + // 将数据从主机复制到设备 + CUDA_CHECK(cudaMemcpy(d_A, h_A.data(), size, cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpy(d_B, h_B.data(), size, cudaMemcpyHostToDevice)); + + // 配置执行参数 + int threadsPerBlock = 256; + int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock; + + // 记录开始时间 + auto start = std::chrono::high_resolution_clock::now(); + + // 启动CUDA核函数 + vectorAdd<<>>(d_A, d_B, d_C, N); + + // 检查核函数启动错误 + CUDA_CHECK(cudaGetLastError()); + + // 等待GPU完成所有操作 + CUDA_CHECK(cudaDeviceSynchronize()); + + // 记录结束时间 + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + // 将结果从设备复制回主机 + CUDA_CHECK(cudaMemcpy(h_C.data(), d_C, size, cudaMemcpyDeviceToHost)); + + // 验证结果 + bool success = true; + for (int i = 0; i < N; i++) + { + if (std::abs(h_C[i] - (h_A[i] + h_B[i])) > 1e-5) + { + success = false; + break; + } + } + + // 输出结果 + std::cout << "CUDA Vector Addition Test:" << std::endl; + std::cout << "Vector size: " << N << std::endl; + std::cout << "Execution time: " << duration.count() << " microseconds" << std::endl; + std::cout << "Verification: " << (success ? "PASSED" : "FAILED") << std::endl; + std::cout << "Sample results (first 10 elements):" << std::endl; + for (int i = 0; i < 10; i++) + { + std::cout << h_A[i] << " + " << h_B[i] << " = " << h_C[i] << std::endl; + } + + // 释放设备内存 + CUDA_CHECK(cudaFree(d_A)); + CUDA_CHECK(cudaFree(d_B)); + CUDA_CHECK(cudaFree(d_C)); + + return 0; +}