Browse Source

完善readme、CMakeLists、线程划分

master
Dtouch 2 years ago
parent
commit
4d99a1d8d1
  1. 1
      .idea/.name
  2. 16
      CMakeLists.txt
  3. 8
      NurbsEvaluator.cu
  4. 31
      README.md
  5. 2
      main.cpp

1
.idea/.name

@ -1 +0,0 @@
untitled1

16
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("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
#add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/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)

8
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();

31
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

2
main.cpp

@ -1,5 +1,5 @@
#include "NurbsEvaluator.cuh"
#include <cstdio>
#include "NurbsEvaluator.cuh"
int main() {
NurbsSurface::Evaluator nurbsSurfaceEvaluator({

Loading…
Cancel
Save