Diderot: 领域专用语言实现的可移植的并行科学可视化与图像分析(Diderot: a Domain-Specific Language for Portable Parallel Scientific Visualization and Image Analysis)

随着科学数据越来越大以及数据处理分析越来越复杂,科学可视化系统面临两个重要的挑战:
1)数据在可视化之前的预处理与分析需要更灵活的并行计算
2)数据分析过程中涉及到的复杂数学计算需要抽象成简单的函数调用

领域专用语言可以很好地解决以上两个问题。本文提出的Diderot[1]系统主要从以下几个方面解决这两个问题。
1)可移植的并行设计,使用基于POSIX标准的pthread实现线程级。
2)定义strand(股),并使用strand创建线程,线程的一次执行就叫做strand的一次迭代。此外,strand还支持线程之间的通信。
3)抽象复杂的数学计算。简化导数,梯度,卷积,张量计算过程。将这些复杂的计算封装成简单函数调用。在代码中支持直接使用这些数学计算的操作符。
4)封装成C/C++的API。方便其他使用C/C++开发的程序调用。
5)卷积计算操作(如clamp, mirror以及wrap等操作)。

Diderot提供对一些数据描述的简化操作。主要从支持以下抽象代码实现的

image(2)[] I = image(“hand.nrrd”);

其中(2)表示hand.nrrd数据为二维数据,[]表示变量的个数。[]中间空表示标量,[3]表示三维向量,[3,3]表示3×3矩阵。

再如
conv
是在一个一阶连续(#1)的二维数据([])上定义了一个标量函数F,该函数使用Catmull-Rom(ctmr)进行抗锯齿锐化,而锐化使用卷积符实现。

basiccode

图 1 简单的Diderot代码

 上面的代码是一段简单的Diderot的代码,update表示线程的一次迭代;die表示线程强制退出;stabilize表示结束当前线程并输出被output标记过的变量。

strand creation and communication

图 2 strand执行的多种状态

strand可以看成是线程的一次执行,update表示执行过程中的一次迭代;read表示线程间数据共享,因为本系统使用的线程是由pthread实现的,因此线程之间的内存是共享的;idle表示线程等待,例如线程在stablilize之后将不再执行,而是等待其它线程结束后,将被标记为output的变量输出;spawn表示将当前线程创建一个子线程。

为了评估本文设计的系统,作者还给出了三个应用实例。

应用一:图像处理中的isocontour提取

isocontour.codes图 3 图像处理中的isocontour提取的代码

isocontour.result图 4 图像处理中的isocontour提取

给定isovalue提取图像的isocontour。从图中代码可以看出,Diderot允许用户直接对标量或张量进行一些数学计算,如计算微分或计算张量积等。

应用二:标量数据,矢量数据以及张量成像数据的体绘制

vr.codes图 5 Volume rendering的代码

vr_01 图 6 标量场Volume rendering

vr_02图 7 矢量场速度值满足一定特征的体绘制结果vr_03图 8 张量成像数据中满足各向异性值分数值FA为0.3的体绘制结果

Volume rendering还提供了过滤功能,可以只显示指定强度值的结果。此外,还可以对流场中特定速度或速度满足一定特征的区域用体绘制方式绘制出来。以及将张量成像数据中各向异性值分数(FA)为特定值的区域用体绘制方式绘制出来,其中FA是通过张量乘积计算得到的。图6,图7与图8三图渲染的结果分别对应对标量数据,矢量数据以及张量成像数据的体绘制结果。

应用三:流线与LIC相融合的流场数据渲染

streamlineOverLIC.codes图 9 LIC和Streamline的代码

streamlineOverLICLIC基础上绘制Streamline的渲染结果

最后一个应用实例是用Diderot实现LIC,在LIC渲染湍流数据之上,还将部分流线绘制出来。
与PLDI上第一个版本的Diderot[2]进行性能对比,从性能图与表中可以看出,本文提出的新方法在性能上比第一个版本在三个应用实例上都有比较大的提高,线程的可扩展性也表现更好。

综上,本文提出的Diderot[1]是基于他们的前一个工作(Diderot版本一[2])的基础上做进一步优化与提升的。较之第一个版本,本文提出的并行方法性能更高(使用strand的创建线程与支持共享内存)以及代码直接支持向量与张量的一些数学运算,例如,求微分,求卷积,求张量乘积等。

但是,个人认为本文还是有两个缺点

其一、从本文实现的DSL代码看,大部分代码长度比较长,用户仍然需要对底层的计算过程有一定的了解,而不是像2014年VIS上两篇DSL文章Vivaldi[3]和ViSlang[4]对用户隐藏了底层的实现细节,用户只需要很简短的代码以及少量变量就可以实现灵活的并行体绘制。

其二、本文提出的Diderot更像一个API(类似OpenGL等),只是对一些数学计算以及特定功能计算进行了一定的library封装(本文作者在文中也表示过“DSL与library之间的区别比较模糊”,因为用户还是需要了解具体的计算过程,如体绘制中的射线积分,以及图像锐化时的卷积计算等。

References:
[1] Gordon Kindlmann, Charisee Chiw, Nicholas Seltzer, Lamont Samuels, and John Reppy. Diderot: a Domain-Specific Language for Portable Parallel Scientific Visualization and Image Analysis. IEEE Transactions on Visualization and Computer Graphics (SciVis 2015), 2015. To appear.

[2] Charisee Chiw, Gordon Kindlmann, John Reppy, Lamont Samuels, and Nick Seltzer. Diderot: a parallel dsl for image analysis and visualization. In Proceedings of the 33rd ACM SIGPLAN conference on Programming language design and implementation, 2012.

[3] Hyungsuk Choi, Woohyuk Choi, Tran Minh Quan, David Hildebrand, Hanspeter Pfister, and Won-Ki Jeong. Vivaldi: A domain-specific language for volume processing and visualization on distributed hetero
geneous systems. IEEE Transactions on Visualization and Computer Graphics, 20(12):2407–2416, 2014.

[4] Peter Rautek, Stefan Bruckner, Eduard Grller, and Markus Hadwiger. ViSlang: A system for interpreted domain-specific languages for scientific visualization. IEEE Transactions on Visualization and Computer Graphics, 20(12):2388–2396, 2014.

评论关闭。