简单的光线追踪--GPU高性能编程CUDA实战第六章

本文通过光线追踪实例介绍了CUDA中常量内存的使用,以提升GPU计算性能。常量内存允许一次性读取数据,适用于所有线程处理相同数据的场景。文章还涉及CUDA事件API用于计时,展示常量内存对程序运行速度的提升。最后,展示了如何将数据从主机复制到设备的常量内存中,以优化代码执行。
摘要由CSDN通过智能技术生成

光线跟踪Ray Traceing是本章的一个例子,用来讲什么是常量内存(Constant memory),之前的实验给分配的内存都是在全局内存里,线程读取数据的时候是每个线程分别进行一次读取操作,也就是说运行时间都用在了读取上。这就大大的降低了GPU的计算性能。常量内存的好处是读取一次数据,就相当于给半个线程束里同时读取,一个Warp是32个线程,这样读取一次就是完成里全局内存中十六次的读取,时间上就是原来的1/16,但是这是有前提的,每个线程要处理的数据必须是完全一样的,那么之前的点积运算和共享内存那样的位图就不适合了,因为每个线程处理的数据不一样,这样反而会降低读取的速度,那么这个光线跟踪的例子就很好的运用在常量内存中,并提高程序的运行速度。

这里还有个CUDA的事件API,其中一个就是用来计时的,通过计时来观察生成同样的图片所用的时间,来发现常量内存的伟大之处!

cuda中的事件本质是GPU时间戳,由于GPU本身支持记录时间戳,就直接定义一个事件,然后记录一个事件就可以了

  cudaEvent_t start;

cudaEventCreate(&start);

cudaEventRecord(start,0);//这个参数为0,有关于流,我还没学到

要统计一段代码的事件,要加上结束的事件,因此,用法应该是这样的:

cudaEvent_t     start, stop;
    cudaEventCreate( &start ) ;
    cudaEventCreate( &stop ) ;
    cudaEventRecord( start, 0 ) ;

//这里就是需要执行的代码

  cudaEventRecord( stop, 0 ) ;

//GPU和CPU之间是可以并行计算的,GPU在生成计算的过程中,cpu其实可以接着进行下面的语句的,既然是计时,我们自然不让它这么做,所以这个事件就是用来
    cudaEventSynchronize( stop ) ;
    float   elapsedTime;//这个参数就是下面这个计算时间的函数用来输出时间的,必须是浮点型的好像

cudaEventElapsedTime(&elapsedTime,start, stop ) ;
    printf( "Time to generate:  %3.1f ms\n", elapsedTime );
cudaEventDestroy( start ) ;
    cudaEventDestroy( stop ) ;//事件的内存在用完了也应该要释放,这也很重要


有关数学方面的计算我也没有深究,有时间再看,关键的是把常量内存搞清楚!


                
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值