From 4d99a1d8d1f9634f43bd2773da15fc1a0a0bedd1 Mon Sep 17 00:00:00 2001 From: Dtouch Date: Thu, 10 Nov 2022 22:21:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84readme=E3=80=81CMakeLists?= =?UTF-8?q?=E3=80=81=E7=BA=BF=E7=A8=8B=E5=88=92=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.name | 1 - CMakeLists.txt | 16 +++++++++------- NurbsEvaluator.cu | 8 ++++---- README.md | 31 ++++++++++++++++++++++--------- main.cpp | 2 +- 5 files changed, 36 insertions(+), 22 deletions(-) delete mode 100644 .idea/.name diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 08b0699..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -untitled1 \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 1af58d6..9aaee53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,20 @@ cmake_minimum_required(VERSION 3.21) -project(untitled1 LANGUAGES CXX CUDA) +project(NurbsEvaluator LANGUAGES CXX CUDA) set(CMAKE_CUDA_STANDARD 14) -add_executable(untitled1 main.cpp NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h) +add_executable(NurbsEvaluator main.cpp NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h) -target_link_libraries(untitled1 PUBLIC "E:/cuda/tmp/NurbsEvaluator/cmake-build-debug/lib/NurbsEvaluator2.lib") -target_include_directories(untitled1 PUBLIC "E:/cuda/tmp/NurbsEvaluator/") +#add_compile_options("$<$:/utf-8>") +#add_compile_options("$<$:/utf-8>") -add_compile_options("$<$:/utf-8>") -add_compile_options("$<$:/utf-8>") +# 指定静态库位置 +#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +#生成静态库 +#add_library(NurbsEvaluator NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h) # 引用系统环境变量CUDA_PATH include_directories("$ENV{CUDA_PATH}/include") -set_target_properties(untitled1 PROPERTIES +set_target_properties(NurbsEvaluator PROPERTIES CUDA_SEPARABLE_COMPILATION ON) diff --git a/NurbsEvaluator.cu b/NurbsEvaluator.cu index 2ade471..19409fc 100644 --- a/NurbsEvaluator.cu +++ b/NurbsEvaluator.cu @@ -48,8 +48,8 @@ NurbsSurface::Evaluator::calculate(int sampleCnt_u, int sampleCnt_v) { cudaMemcpy(d_knots_v, h_knotsV, knotsBytesV, cudaMemcpyHostToDevice); // 构造线程层级,调用核函数 - const dim3 grid(32, 32); - const dim3 block((sampleCnt_u + grid.x - 1) / grid.x, (sampleCnt_v + grid.y - 1) / grid.y); + dim3 block(32, 32); + dim3 grid((sampleCnt_u + block.x - 1) / block.x, (sampleCnt_v + block.y - 1) / block.y); // 记录用时 double time_cost_device; if(recordTime) time_cost_device = utils::get_time_windows(); @@ -176,8 +176,8 @@ NurbsCurve::Evaluator::calculate(int sampleCnt) { cudaMemcpy(d_knots, h_knots, knotsBytes, cudaMemcpyHostToDevice); // 构造线程层级,调用核函数 - const dim3 grid(32, 32); - const dim3 block((sampleCnt + grid.x - 1) / grid.x, (sampleCnt + grid.y - 1) / grid.y); + dim3 block(32, 32); + dim3 grid((sampleCnt + block.x * block.y - 1) / (block.x * block.y)); // 记录用时 double time_cost_device; if(recordTime) time_cost_device = utils::get_time_windows(); diff --git a/README.md b/README.md index 1f72ca0..dbdc060 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,23 @@ A tool for evaluating multiple NURBS curve/surface points using the GPU. ## Usage - -#### Nurbs曲线 +### 直接运行 +根据CMake构建项目,运行main文件即可生成可执行文件 +### 作为依赖使用 +1. CMakeLists.txt中注释以下代码,不再生成可执行文件 +```cmake +add_executable(NurbsEvaluator main.cpp NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h) +``` +2. CMakeLists.txt中取消注释以下代码,表示需要生成静态库。构建项目。 +```cmake +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +add_library(NurbsEvaluator NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h) +``` +3. 原项目连接到生成的静态库目录。如果是由CMake构建,可以用 target_link_libraries 指向依赖(.lib),用 target_include_directories 指向头文件目录。 +4. 使用.cu文件调用NurbsEvaluator +### Nurbs曲线 在构造函数中传入控制点向量和knots向量: -```C++ +```c++ NurbsCurve::Evaluator nurbsCurveEvaluator( { {-1, 0, 0}, @@ -28,17 +41,17 @@ NurbsCurve::Evaluator nurbsCurveEvaluator( ); // 6点控制,knots长度为9,degree为2的NURBS ``` 设置是否需要输出GPU并行计算花费的时间(默认否): -```C++ +```c++ nurbsCurveEvaluator.setRecordTime(true); -``` +``` 开始计算 -```C++ +```c++ nurbsCurveEvaluator.calculate(5); // 在参数域采样5个点 ``` -#### Nurbs曲面 +### Nurbs曲面 曲面在构造函数中需要传入三层vector嵌套表示的二维点阵、u方向的knots向量、v方向的knots向量 -```C++ +```c++ NurbsSurface::Evaluator nurbsSurfaceEvaluator( { {{-1, 0, 0}, {0, 1, 6}, {1, 0, 4}, {2, 0.5, 3}, {3, 3, 1}, {4, -5, 0}}, @@ -55,6 +68,6 @@ nurbsSurfaceEvaluator.setRecordTime(true); nurbsSurfaceEvaluator.calculate(3, 4); // 计算时需要传入u、v两个方向的采样数目 ``` -# Primary Reference +## Primary Reference + [Direct Evaluation of NURBS Curves and Surfaces on the GPU - 2007 - Krishnamurthy, Khardekar, Mcmains](https://dl.acm.org/doi/abs/10.1145/1236246.1236293) + CUDA C编程权威指南 - 2017 - 程润伟 , Max Grossman , Ty McKercher \ No newline at end of file diff --git a/main.cpp b/main.cpp index 08a0437..81234c7 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,5 @@ -#include "NurbsEvaluator.cuh" #include +#include "NurbsEvaluator.cuh" int main() { NurbsSurface::Evaluator nurbsSurfaceEvaluator({