在我们以前的博客文章“ Interactive C ++ with Cling”中,我们提到了探索性编程是减少问题复杂性的有效方法。这篇文章将讨论为支持数据科学研究人员而开发的Cling的一些应用程序。特别是,交互式探测数据和接口使复杂的库和复杂的数据更易于访问。我们旨在大规模展示Cling的某些功能; Cling的评估风格的编程支持;以及与保鲜相关的项目;和showinteractive C ++ / CUDA。
Cling实例可以通过其运行时访问自身。该示例创建了一个cling :: Value来存储增量变量i的执行结果。该机制可以进一步用于支持动态范围,从而在运行时扩展名称查找。
[cling] $ #include< cling / Interpreter /Value.h> [cling] $ #include< cling / Interpreter /Interpreter.h> [cling] $ int i = 1; [cling] $ cling ::值V; [cling] $ gCling-> evaluate(" ++ i&#34 ;, V); [cling] $ i(int)2 [cling] $ V(cling :: Value&)框[(int)2]
V将表达式结果“装箱”,必要时可以提供更长的生存期。cling :: Value可用于将表达式值从解释器传递到已编译的代码。
这种机制引入了延迟直到运行时评估,这使得某些功能可以增加C ++语言的动态外观。
高能物理(HEP)领域中用于存储,研究和可视化科学数据的主要工具是专用软件包ROOT.ROOT是一组相互连接的组件,可帮助科学家从科学论文发表后的数据存储和研究到其可视化。根在科学发现中起着重要作用,例如重力波,基奥普斯金字塔中的大空腔,大强子对撞机发现希格斯玻色子。在过去的5年中,Cling帮助分析了1个EB物理数据,作为1000多种科学出版物的基础,并支持在分布式百万CPU核心计算设施中运行的软件。
ROOT使用Cling作为数据序列化的反射信息服务。 C ++对象以二进制格式垂直存储。用户可以使用已加载数据文件的内容,并且C ++对象成为第一类。
由Cling启用的ROOT的核心组件是eval风格的编程。我们在HEP中使用this来简化检查和使用ROOT存储的C ++对象的功能.Cling使ROOT可以在打开文件时将可用的对象名称注入名称查找中:
[root] ntuple-> GetTitle()错误:使用未声明的标识符' ntuple' [root] TFile :: Open(" tutorials / hsimple.root"); ntuple-> GetTitle()//#1(const char *)" Demo ntuple" [root] gFile-> ls(); TFile **教程/hsimple.root具有直方图TFile的演示根文件*教程/hsimple.root带有直方图的演示根文件OBJ:TH1F hpx这是px分布:0 at:0x7fadbb84e390 OBJ:TNtuple ntuple Demo ntuple:0 at:0x7fadbb93a890 KEY:TH1F hpx; 1这是px分布。KEY:TNtuple ntuple; 1个演示ntuple [root] hpx-> Draw()
ROOT框架分两个阶段向名称查找中注入其他名称:首先,它通过标记ntuple(#1)的存在来构建无效的AST,然后将nit转换为gCling-> EvaluateT< / * return type * / void&gt ;. (" ntuple-> GetTitle()&#34 ;, / * context * /);在下一阶段,ROOT在运行时打开文件,读取其序言,并通过外部名称查找工具注入名称。铛。如果ntuple-> GetTitle()接受参数,则转换将变得更加复杂。
Jupyter Notebook技术允许用户创建和共享包含实时代码,等式,可视化和叙述文本的文档。它使数据科学家能够以直接,可重复的方式共享他们的分析,从而轻松地交换想法或进行协作。语言不可知论是Jupyter项目的关键设计原则,Jupyter前端通过明确指定的协议与内核(运行代码的基础结构部分)进行通信。已经为R,Julia,Python,Fortran等多种编程语言开发了内核(通过基于LLVM的LFortranproject)。
Jupyter的官方C ++内核依赖于Xeus(一种内核协议的C ++实现)和Cling。对内核协议使用引用实现的一个优点是免费提供了许多功能,例如丰富的mime类型显示,交互式小部件,自动完成等等。
可以通过为所述类型提供mime_bundle_repr的重载来指定用于用户定义类型的丰富的mime类型呈现,该重载由依赖参数的查找来获取。
丰富的mime类型呈现的可能性是无止境的,例如带有HTML表的数据帧的丰富显示,甚至是在前端使用JavaScript扩展呈现的mime类型。
SymEnginesymbolic计算库是使用Mathjax进行丰富呈现的一个高级示例。
Xeus-cling随附Jupyter小部件协议的实现,该协议支持与后端的双向通信。
Xeus和Xeus-cling内核最近被合并为Jupyter的子项目,并受其行为准则和一般治理的约束。
针对xeus-cling内核的计划未来开发包括:通过实现目前缺乏的Jupyter is_complete消息,增加对Jupyter控制台界面的支持;增加了对紧贴“点命令”作为Jupyter魔术的支持;并支持最近添加到Jupyter内核协议中的新调试器协议,该协议将使JupyterLab可视调试器与C ++内核一起使用。
另一个将交互式绘图功能引入xeus-cling的工具是xvega,它处于开发的早期阶段,它可以生成可在笔记本中显示的vega图表。
Cling CUDA扩展将交互式C ++的工作流程带到了GPU,而不会损失性能和与现有软件的兼容性。为了执行CUDA C ++代码,Cling激活了编译器前端中的扩展以了解CUDA C ++的方言,并创建了第二个编译器实例来编译GPU的代码。
像普通的C ++模式一样,CUDA C ++模式使用AST转换来启用交互式CUDA C ++或特殊功能(如Cling打印系统)。与用于主机代码的普通Cling编译器管道不同,devicecompiler管道并未使用主机管道的所有转换,因此设备管道具有一些特殊的转换。
[cling] #include< iostream> [cling] #include< cublas_v2.h> [cling] #pragma cling(load" libcublas.so")//链接共享库//设置参数//分配内存// // ... [cling] __global__ void init(float * matrix,int size){[cling]吗? int x = blockIdx.x * blockDim.x + threadIdx.x; [cling]吗?如果(x< size)[依附]? matrix [x] = x; [cing]吗? } [cling] [cling] //直接在全局空间中启动函数[cling] init<<&lt ;;块,线程>>>(d_A,dim * dim); [cling] init< <<<块,线程>>>(d_B,暗* dim); ,dim,& beta,d_C,dim); [cling] cublasGetVector(dim * dim,sizeof(h_C [0]),d_C,1,h_C,1); [cling] cudaGetLastError()(cudaError_t)(cudaError: :cudaSuccess):(unsigned int)0
像普通的C ++模式一样,CUDA模式可以在Jupyter Notebook中使用。
CUDA模式下Cling的一个特殊属性是,在第一次CUDA API调用时,Cling应用程序成为普通的CUDA应用程序。这将启用带有Cling的CUDA SDK。例如,您可以使用CUDA分析器nvprof ./cling -xcuda来分析您的交互式应用程序。该docker容器可用于体验Cling的CUDA模式。
CUDA模式的计划未来开发包括:支持完整的当前CUDA API;重新定义CUDA内核;支持其他GPU SDK,例如HIP(AMD)和SYCL(Intel)。
我们将Interactive C ++的使用视为开发数据科学界的研究人员的重要工具。 Cling使ROOT成为高能物理领域中的“必备”数据分析工具,从有效的I / O到绘图和拟合,应有尽有。交互式CUDA后端允许轻松集成研究工作流,并简化C ++和CUDA之间的通信。由于Jupyter Notebook已成为数据分析人员探索想法的标准方式,因此Xeus-cling确保在每个C ++笔记本中都可以使用出色的交互式C ++成分。
在下一篇博客文章中,我们将重点介绍交互式C ++之外的Cling支持功能,尤其是语言的互操作性。
作者在此感谢Sylvain Corlay,Simeon Ehrig,David Lange,Chris Lattner,Javier Lopez Gomez,Wim Lavrijsen,Axel Naumann,Alexander Penev,Xavier Valls Pla,Richard Smith,Martin Vassilev的贡献。