美文网首页
JTL01:02JupyterLab使用CPlusPlus内核

JTL01:02JupyterLab使用CPlusPlus内核

作者: 杨强AT南京 | 来源:发表于2020-01-06 14:20 被阅读0次

  使用Jupyter测试并行运算与GPU运算,所以配置并使用了C++作为运行内核,这个帖子的主题就是cling内核的使用入门。主要包含:
    1. 内核安装与配置;
    2. Cling的交互式编程方式;
    3. 交互式编程的动态库调用方式;


C++内核安装与配置

  • 在JupyterLab中支持的C++内核与Jupyter Notebook一样的安装,就是安装Cling交互式C++编程工具。

  • Cling的安装方式有两种:

    1. 源代码安装
    2. 预编译二进制安装

源代码安装

  • 请参考12:cling的安装: https://www.jianshu.com/p/95c4616fedd7

二进制安装

  1. 下载二进制安装文件:https://root.cern.ch/download/cling/
cling的二进制安装文件下载页面截图
  1. 设置cling的路径
    • 因为JupyterLab也是调用命令行实现交互式执行代码,所以需要能找到cling的命令行程序。在系统或者用户配置文件中设置:
      • export PATH="cling的路径": ${PATH}
      • 用户配置文件一般都在用户HOME主目录下的:.bash_profile文件。
      • 配置好以后,要么重启,要么使用 .(source命令)命令重新加载一下即可。
cling的PATH配置
  1. 安装cling到JupyterLab
    • 这个安装很简单,JupyterLab本身提供工具安装内核;安转的官方参考地址:https://github.com/root-project/cling/tree/master/tools/Jupyter
    1. 步骤1:切换到cling下载后的解压目录:cd ${JupyterLab_HOME}/share/cling/Jupyter/kernel$
    2. 步骤2:使用pip的文件安装方式安装相关模块到Python:pip install -e .
    3. 步骤3:配置cling的不同C++内核到JupyterLab环境:jupyter-kernelspec install cling-cpp17
      • 其中提供哪些版本,可以到cling的kernel目录下查看。(一般支持C11,C14,C17)
Cling支持的C++版本
  • 如果完成以上操作后,可以启动JupyterLab了
    • jupyter lab
人见人爱的JupyterLab界面

交互式C++编程与非交互式编程

  1. 非交互式编程就是传统的编写源代码,然后预编译、编译、链接生成执行文件,最后执行。

    • 非交互式C++的执行总是从main函数开始
  2. 交互式编程是目前高级语言差不多都支持的编程模式了,Javascript,Python,Go,Swift,R,Matlab都支持交互式编程。

    • 交互式C++,有三个方面需要与非交互式编程区分开来。
      1. 代码不能与头文件引入混和在一起。
      2. main函数不在自动作为入口调用,而是及时直接执行。
      3. 不能重复定义:函数与变量。

JupyterLab运行C++语句例子

  • 注意:
    1. 头文件与语句分开,可以尝试混合在一起执行看看错误效果。
    2. 没有main函数的概念了。
#include <iostream> 
std::cout << "Hi,JupyterLab交互式C++编程!" << std::endl;
Hi,JupyterLab交互式C++编程!

(std::basic_ostream &) @0x7fff96461760

JupyterLab调用C++函数例子

  • 注意:
    1. 函数不能重复定义;
  1. 函数定义
int add(int num_added, int num_add){
    std::cout << "加法执行!" << std::endl;
    return num_added + num_add;
}
  1. 函数调用
std::cout << add(45, 55) << std::endl;
加法执行!
100

(std::basic_ostream &) @0x7fff96461760

头文件与动态库

  • 编程的两板斧:

    1. 语法
    2. 库调用
  • 所以C++编程常见的就是各种库调用,一般标准库编译器自动加载,但是用户的so/dll lib库就需要用户自己处理:

    1. 传统的非交互式编程通过命令行的-I -L -l三个选项参数处理;
    2. 交互式编程就使用C++标准中的代码动态调用机制解决;
      • 预处理扩展指令:#progam来处理,其中的cling的扩展就是:@pragma cling 扩展指令

动态库准备

  1. 代码-h文件

#ifndef FUNC_H
#define FUNC_H
int cv_add(int na, int nb);
#endif

  1. 代码-cpp

#include "func.h"

int cv_add(int na, int nb){
    return na + nb;
}

  1. 动态库编译
    • 其中的Makefile中的tab键,需要设置下,否则使用4个空白代替。
      • [Settings] -> [Text Editor Indentation] -> [Indent with Tab]
  • Makefile脚本

G++     =g++
SOURCES =func.cpp
LIBARGS =-fPIC --shared
LIBNAME =libfunc.so
main:$(SOURCES)
    $(G++) $(LIBARGS) $(SOURCES)  -o $(LIBNAME)

  • 执行编译脚本
    • make main
编译后的动态库

调用动态库

  1. 头文件引入
    • 这个需要单独引入的,如果有路径,请带上路径,我们例子中是src。
      • 与可以使用pragma指定头文件路径。
    • 头文件引入函数声明,解决C++强类型的语法要求,任何identifier都需要定义。
#include "./src/func.h"
  1. 使用动态库
    1. 使用pragma预处理指令;
    2. 调用库函数;
#pragma cling add_library_path("./src")
#pragma cling load("func")
std::cout << cv_add(155, 245) << std::endl;
400

(std::basic_ostream &) @0x7fff96461760
  1. gragma预处理指令的三种使用方式
    1. #pragma cling add_include_path("include_directory")
      • 设置头文件目录
    2. #pragma cling add_library_path("library_directory")
      • 设置lib库文件目录
    3. #pragma cling load("libname")
      • 设置lib库名
  • 注意:
    • pragma在不同的编译器,这个扩展是不一样的。可以参考对应编译器的文档获取。

终端转义序列支持测试

  • 实际上Mac与Unix/Linux支持转义序列的,在Jupyter中也支持的很好,下面是转义序列的例子(使用bash指令):
bash命令行的转义序列使用

转义序列的例子

std::cout << "\033[31mHello\033[0m" << std::endl;
�[31mHello�[0m

(std::basic_ostream &) @0x7fff96461760
std::cout << "\033[34;41mWorld\033[0m" << std::endl;
�[34;41mWorld�[0m

(std::basic_ostream &) @0x7fff96461760

附录

  1. 转义序列可以参考我的一个帖子:
    • 02.ANSI/VT100终端控制转义序列:https://www.jianshu.com/p/a7f22e71b5af
    • 03.在linux终端中修改窗体标题:https://www.jianshu.com/p/e1af426b1a04

相关文章

  • JTL01:02JupyterLab使用CPlusPlus内核

      使用Jupyter测试并行运算与GPU运算,所以配置并使用了C++作为运行内核,这个帖子的主题就是cling内...

  • C++ ---- malloc 和 new

    可以在http://www.cplusplus.com/[http://www.cplusplus.com/]上查...

  • c++ 进程间通信

    进程间通信 各个函数的参数及使用请参考https://github.com/fanflame/cplusplus_...

  • CPlusPlus basics

    马上要学compiler construction和Database implementation两门课,用的是C...

  • 关于__cplusplus

    __cplusplus,这是一个c++预定义宏,我了解的值有两个 c++ 98中,是199711L(很多版本都是这...

  • 常见源码中的宏定义

    1._ _cplusplus 、extern "c" { }_ _cplusplus 是c++中特有的宏定义,在我...

  • 2018-05-29

    ifdef __cplusplus...的含义 ifdef __cplusplus 倒底是什么意思? 时常在cpp...

  • 前端开发兼容大全

    内核 使用Webkit内核的浏览器:Safari、Chrome;使用Trident内核的浏览器:IE、Maxtho...

  • web通用测试案例汇总

    一、科普 浏览器内核分类Trident内核又称IE内核,IE系列浏览器均采用此种内核,360安全浏览器也使用此内核...

  • 让浏览器优先选择指定内核渲染

    国产浏览器大多是双内核,甚至是三内核。一个Chromium内核,也就是Chrome使用的内核,切换到这个内核的模式...

网友评论

      本文标题:JTL01:02JupyterLab使用CPlusPlus内核

      本文链接:https://www.haomeiwen.com/subject/aphkactx.html