SyclParallelSTL, 开放源码并行STL实现

分享于 

10分钟阅读

GitHub

  繁體 雙語
Open Source Parallel STL implementation
  • 源代码名称:SyclParallelSTL
  • 源代码网址:http://www.github.com/KhronosGroup/SyclParallelSTL
  • SyclParallelSTL源代码文档
  • SyclParallelSTL源代码下载
  • Git URL:
    git://www.github.com/KhronosGroup/SyclParallelSTL.git
    Git Clone代码到本地:
    git clone http://www.github.com/KhronosGroup/SyclParallelSTL
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/KhronosGroup/SyclParallelSTL
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    SYCL并行 STL Build Status

    这里项目使用SYCL标准实现并行STL库的实现。

    什么是并行 STL

    并行STL是实现并行的C++ 扩展技术规范的实现,当前文档编号为 N4507. 这个技术规范描述了接口的实现,它是用 C++ 编程语言编写的接口来调用带有并行执行功能的算法的一组需求。 实际上,该规范针对下一个 C++ 标准,为用户提供了一个机会,为传统的STL算法execution执行这些算法以并行执行这些算法。 各种策略可以指定不同类型的并行执行。 比如,

    
    std::vector<int> v =.. .
    
    
    //Traditional sequential sort
    
    
    std::sort(vec.begin(), vec.end());
    
    
    //Explicit sequential sort
    
    
    std::sort(seq, vec.begin(), vec.end());
    
    
    //Explicit parallel sort
    
    
    std::sort(par, vec.begin(), vec.end());
    
    
    
    

    什么是 SYCL?

    是一个免费的。跨平台 C++ 抽象层,它构建在OpenCL之上。 SYCL支持在 C++ 中单独开发OpenCL应用程序,同时支持传统的主机编译器生成标准的C++ 代码。

    SyclParallelSTL

    SyclParallelSTL在 experimental::parallel 命名空间中公开SYCL策略,它可以传递给标准的STL算法,以便在SYCL上运行。 目前,只实现了一些STL算法,例如:

    • sort: 对于大小为2 或者顺序排序的范围,Bitonic排序为。
    • 转换:设备上的并行迭代( 每个元素一个线程)。
    • fill: 设备上的并行迭代( 每个元素一个线程)。
    • fill_n: 设备上的并行迭代( 每个元素一个线程)。
    • 生成:设备上的并行迭代( 每个元素一个线程)。
    • generate_n: 设备上的并行迭代( 每个元素一个线程)。
    • for_each: 设备上的并行迭代( 每个元素一个线程)。
    • for_each_n: 设备上的并行迭代( 每个元素一个工作项)。
    • 替换:设备上的并行迭代( 每个元素一个线程)。
    • replace_if: 设备上的并行迭代( 每个元素一个线程)。
    • replace_copy: 设备上的并行迭代( 每个元素一个线程)。
    • replace_copy_if: 设备上的并行迭代( 每个元素一个线程)。
    • 反向:设备上的并行迭代( 每个 2元素中的一个工作项)。
    • reverse_copy: 设备上的并行迭代( 每个元素一个工作项)。
    • 计数:设备上的并行迭代( 每个 2元素中的一个工作项)。
    • count_if: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • reduce: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • inner_product: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • transform_reduce: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • inclusive_scan: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • exclusive_scan: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • 不匹配:设备上的并行迭代( 每个 2元素中的一个工作项)。
    • all_of: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • any_of: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • none_of: 设备上的并行迭代( 每个 2元素中的一个工作项)。
    • 相等:设备上的并行迭代( 每个 2元素中的一个工作项)。

    实现了一些优化例如:

    • 能够将迭代器传递给缓冲区而不是使用STL容器来减少复制和输出的信息量
    • 能够为SYCL策略指定队列,以便将队列用于各种内核的( 潜在地启用调用的异步执行)。

    生成项目

    这个项目目前支持 Codeplay。ComputeCPP和开源triSYCL实现的SYCL beta实现。

    项目使用 CMake 3.5,生成生成文件,但最新版本可能会工作。

    在Linux中,只需创建一个生成目录并按如下所示运行 CMake:

    
    $ mkdir build
    
    
    $ cd build
    
    
    $ cmake.. /-DCOMPUTECPP_PACKAGE_ROOT_DIR=/path/to/sycl 
    
    
    $ make
    
    
    
    

    常用的配置选项可用( 比如。 构建调试或者发布。Linux支持Makefile和忍者生成器。

    为简化配置,来自 ComputeCPP SDK的FindComputeCpp MODULE 包括在 cmake/Modules/ 目录中的这个包中。

    如果在外部/gmock中发现了 Google,则构建一组单元测试。 单元测试可以通过在二进制目录中运行Ctest来运行。 要安装 gmock,请从SYCL并行stl项目的root 目录中运行以下命令:

    
    $ mkdir external
    
    
    $ cd external
    
    
    $ git clone git@github.com:google/googletest.git
    
    
    $ cd googletest/googlemock/make
    
    
    $ make
    
    
    
    

    为了在benchmarks配置行中启用 ,在cmake配置行中启用PARALLEL_STL_BENCHMARKS选项,-DPARALLEL_STL_BENCHMARKS=ON

    使用没有设备编译器的SYCL实现时,启用 SYCL_NO_DEVICE_COMPILER 选项以禁用中间文件生成的特定引导规则。

    参考你的SYCL实现文档以实现特定的构建选项。

    要快速构建项目并使用基准测试运行一些非回归测试,你可以使用脚本 build.sh:

    如果要使用ComputeCpp进行编译:

    
    ./build.sh"path/to/ComputeCpp" (this path can be relative)
    
    
    
    

    例如( 在 Ubuntu 16.04上):

    
    ./build.sh ~/ComputeCpp
    
    
    
    

    如果要使用triSYCL进行编译:

    
    ./build.sh --trisycl [-DTRISYCL_INCLUDE_DIR=path/to/triSYCL/include] [-DBOOST_COMPUTE_INCLUDE_DIR=path/to/boost/compute/include] [-DTRISYCL_OPENCL=ON]
    
    
    
    

    例如( 在 Ubuntu 16.04上):

    
    ./build.sh --trisycl -DTRISYCL_INCLUDE_DIR=~/triSYCL/include -DBOOST_COMPUTE_INCLUDE_DIR=~/compute/include [-DTRISYCL_OPENCL=ON]
    
    
    
    

    或者如果Boost计算机在你的缺省库路径中,只需使用:

    
    ./build.sh --trisycl -DTRISYCL_INCLUDE_DIR=~/triSYCL/include [-DTRISYCL_OPENCL=ON]
    
    
    
    

    只需运行 build.sh 就可以得到一个小。

    如果你希望使用这些功能,某些基准可能会显示消息,如果你希望这些功能不会影响基准执行,那么你可以忽略这些消息,如果你希望这些功能不会影响基准执行,那么你也可以将这些。

    构建文档

    使用Doxygen记录源代码。 要将文档构建为HTML文件,导航到doc目录并从那里运行 doxygen。

    
    $ cd doc
    
    
    $ doxygen
    
    
    
    

    这将生成 inside 页面的doc_output目录。

    限制

    • 可以传递给算法的Lambda函数与任何SYCL内核具有相同的限制。 有关限制的详细信息,请参阅SYCL规范。

    • 在使用lambda函数时,编译器需要为lambda函数找到一个 NAME。 若要提供 lambda NAME,用户必须执行以下操作:

      cl:: sycl:: 队列q,sycl::sycl_execution_policy snp(q); 排序( snp,v.begin(), v.end(), [=] ( int a,int ) ) { 返回> = b ;});

    • 如果要计算的元素的数量不是两个的幂,则要注意某些算法可能会运行顺序版本。 以下算法有这里限制: 排序,inner_product,减少,count_if和 transform_reduce。

    • 参考SYCL实现文档以实现特定的构建选项。

    版权和商标

    英特尔和英特尔 logo 是英特尔公司的商标。 AMD的AMD箭头 logo 及其组合是高级微型设备公司的商标。 OpenCL和 OpenCL logo 是苹果公司的商标。 由Khronos的许可使用。 其他名称仅供参考之用,可能是其各自所有者的商标。


    相关文章