小编Wil*_*ill的帖子

在Haskell程序中分析多线程性能 - 没有使用并行策略的加速

在尝试在Haskell程序中添加多线程功能后,我注意到性能根本没有改善.追逐它,我从threadscope获得了以下数据:

图1 绿色表示正在运行,橙色表示垃圾收集. 图2 图3 这里垂直的绿色条表示火花创建,蓝色条表示并行GC请求,浅蓝色条表示创建线程. 图4 标签是:创建spark,请求并行GC,创建线程n,以及从第2章窃取火花.

平均而言,我只能在4个内核上获得大约25%的活动,这与单线程程序相比没有任何改进.

当然,如果没有实际程序的描述,这个问题就会无效.本质上,我创建了一个可遍历的数据结构(例如树),然后在它上面映射一个函数,然后将其提供给一个图像编写例程(在程序运行结束时解释明确的单线程段,超过15秒) .函数的构造和fmapping都需要花费大量的时间来运行,尽管第二个稍微多一点.

上图是通过在图像写入消耗之前为该数据结构添加parTraversable策略来完成的.我也尝试在数据结构上使用toList,然后使用各种并行列表策略(parList,parListChunk,parBuffer),但每次对于各种参数(甚至使用大块)的结果都相似.
我还试图在将函数映射到它之前完全评估可遍历的数据结构,但是出现了完全相同的问题.

以下是一些其他统计信息(针对同一程序的不同运行):

   5,702,829,756 bytes allocated in the heap
     385,998,024 bytes copied during GC
      55,819,120 bytes maximum residency (8 sample(s))
       1,392,044 bytes maximum slop
             133 MB total memory in use (0 MB lost due to fragmentation)

                                    Tot time (elapsed)  Avg pause  Max pause 
  Gen  0     10379 colls, 10378 par    5.20s    1.40s     0.0001s    0.0327s
  Gen  1         8 colls,     8 par    1.01s    0.25s     0.0319s    0.0509s

  Parallel GC work balance: 1.24 (96361163 / 77659897, ideal 4) …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading profiling haskell

6
推荐指数
1
解决办法
410
查看次数

在路径追踪中处理点光源和精确反射

试图实现蒙特卡罗路径追踪,我在光采样程序中遇到了麻烦.

通常,程序如下:

  • 跟踪从相机(或从前一点)开始的光线,直到到达表面点.
  • 达到表面点后,在场景中的光源上随机生成一个点.
  • 计算几何项,描述该光是否可以达到曲面上的当前点(该项为0或1).
  • 如果此几何项为1,则通过乘以衰减系数(光的距离)和材料的BRDF来计算该光的贡献.

我遗漏了一些关于如何随机选择事物的细节,但暂时不介意(参见例如"分布光线跟踪中的灯具采样").

我认为问题在于,BRDF和光源中的光分布都不是实际功能,而是测量.
例如,对于每个入射角,完美反射镜的BRDF是反射方向上的dirac delta"函数"(即,在一点上支持的度量,在该点处质量为1).类似地,与密度函数相反,点光(与区域光相对)由狄拉克三角洲建模.

直接区分似乎很重要,因为它允许适当的重要性抽样.例如,在对BRDF进行采样时,可以:

  • 均匀地对所有传出方向进行采样,并通过相应的反射分布"函数"进行缩放,
  • 直接根据BRDF进行采样,之后不进行缩放.

介于两者之间的任何事情也是可能的,而且很重要,因为对于复杂的BRDF来说,完全重要的采样是不可能的.
现在,在BRDF实际上是一个dirac delta的情况下,我们看到根据BRDF进行采样变得极其重要:随机抽样,我们必须以概率1忽略贡献(因为BRDF在单个点上得到支持) ,我们在均匀采样方向时选择概率为0,但如果我们确实击中了幸运并获得了反射方向(质量为),那么我们必须将贡献扩大到无限大!如果我们根据BRDF进行采样,我们总是生成反射方向,而不必扩展任何东西(特别是不会遇到任何无穷大).

我的问题是如下:如果它们既是一般措施而不仅仅是功能,那么如何将BRDF"乘以"光的贡献?在考虑BRDF的重要性采样和场景中的灯光分布时,如何在此步骤中正确地"重要性采样"?(灯的采样程序应考虑光分布和BRDF,以避免无穷大.)

理想情况下,人们需要采样程序,这些程序永远不会产生无穷大,无穷大,这应该只是不良采样机制的假象(如上所述).因此,对于随后的四个场景,计算的贡献应始终是有限的:

  • 具有区域光的连续BRDF(例如朗伯漫射材料)
  • 连续BRDF带点光源
  • 具有区域光的离散BRDF(例如完美的镜子)
  • 离散BRDF带点光源

当然,理想情况下,这适用于BRDF和灯光的任何测量,但似乎能够正确地获得上述4种情况是大多数工作的地方.

3d graphics raytracing montecarlo

5
推荐指数
1
解决办法
1751
查看次数