Skip to content

LiuZengqiang/RayTracingInOneWeekendCUDA

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ray tracing in one weekend by CUDA

Ray Tracing in One Weekend in CUDA

简介:

RayTracingInOneWeekendCUDARayTracingInOneWeekend 的CUDA版本实现。

CUDA版本要求:

计算能力要大于等于6.0。 Compute capability >= 6.x

因为代码中需要使用atomicAdd(float*, float)针对浮点数的原子操作,所以需要GPU的计算能力大于等于6.0。

如何运行:

mkdir build
./run.sh

示例结果:

  • 场景1 (800*450, spp=100, max_depth=50)
    示例结果

耗时对比:

场景 分辨率 spp 最大深度 CPU耗时(s) GPU耗时(s)
场景1 800*450 100 50 2019.81 26.91

电脑配置:

  • CPU: Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz
  • GPU: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)
  • CUDA: 11.4
  • nvidia Driver: 470.57.02

CUDA代码针对C++代码的修改:

在实现时,本仓库CUDA代码尽可能和RayTracingInOneWeekend中的代码相似,其中不得不该的部分主要分为以下几点:

  1. doublefloat,因为Current GPUs run fastest when they do calculations in single precision. Double precision calculations can be several times slower on some GPUs
  2. 将需要在GPU端运行的函数前增加__device__函数修饰符号;
  3. 将由CPU端调用,GPU端执行的函数从类函数改为全局函数,并将其他需要在GPU端运行、不适合做为类函数的函数改为全局函数
  4. CUDA不支持智能指针,将C++版本中的智能指针改为普通指针;
  5. 改为在GPU端使用CUDA库产生随机数;
  6. 每个光线申请一个GPU线程,每个像素申请一个vec3类型的内存/显存空间存储该像素颜色值,单个像素可采样多跟光线,即总光线数=像素数*单像素采样数。由于一像素需要采样多条光线,每条光线对应的线程都会读写同一个vec3显存位置的数据,因此需要使用atomicAdd(float*,float)原子操作;

ref:

1. Accelerated Ray Tracing in One Weekend in CUDA
2. 用CUDA加速Ray Tracing in One Weekend- 上
3. 用CUDA加速Ray Tracing in One Weekend- 下

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages