标签: intel-oneapi

理解 AMD GPU 中的 oneAPI 和 SYCL

我是一名 GPGPU 开发人员,我使用 CUDA 完成了所有工作。最近,我为我的家庭设置购买了 AMD GPU,并且我一直在阅读有关 SYCL 和 oneAPI 的文章,但我不确定我是否理解它们是什么,它们是如何互补的。如果我理解正确的话,SYCL 是 Khronos 开发的一个标准,它允许在 C++ 中创建并行软件。它需要一个由 SYCL 实现提供的自定义工具链,并且存在多个实现。

另一方面,oneAPI 是 SYCL 的一个实现,带有一些额外的扩展(将来可能会添加到 SYCL 标准中)和一些带有典型并行库的库,对吗?

因为我有一个AMD GPU,我想用它来做一些GPGPU,但生态系统有点吓人。我们有台面驱动程序、AMD 驱动程序、不同的 openCL 实现、HIP ……这一切是如何组合在一起的?

amd-gpu hip sycl intel-oneapi

10
推荐指数
1
解决办法
1781
查看次数

oneAPI 是什么?它与 TBB 相比如何?

我们已经使用 TBB 多年了,我发现在升级时,我们现在被带到了 oneAPI TBB 页面。oneAPI TBB是否会取代传统TBB?两个版本都得到维护还是独立的 TBB 现已弃用?

尝试确定要迁移到哪个。在我看来,oneAPI TBB 取代了 TBB,因为 TBB 页面自去年以来就没有更新过,但我无法轻易判断。

同样让我困惑的是,在 include 目录中,同时存在 tbb/tbb.h 和 oneapi/tbb/tbb.h ,并且两者都有相同的文件。它们相同吗?我不知道该用哪个。

c++ tbb intel-oneapi

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

安装 Intel oneAPI 后找不到 icc 编译器,在 Ubuntu 20 上从 bash 调用

我的问题是我想从命令行调用 icc 编译器,但我的电脑找不到它。我已经安装了最新的 oneAPI 并获取了 setvars.sh。

即使我在安装例程下搜索'icc'文件我也找不到icc编译器文件。

'which' 命令适用于 mpicc 和 dpcpp 但不适用于 icc can not find icc /// mpicc found but not icc

icc intel-oneapi

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

如何正确使用Intel oneAPI?

今天,我想知道oneAPI 中的 Conda 和 Anaconda 中的 Conda 之间的区别是什么,以及如何以正确的方式使用 oneAPI来最大程度地利用最新的 Intel Core gen 12。

安装 oneAPI 后,它们还包含 conda。但是,在以下情况下我不能将此用作正常条件:

-它不包含 conda-build 和几个像 Anaconda 中的普通 conda 一样的包。

- 无法从 Conda OneAPI 的“基础”创建和克隆其他环境。如果我将“base”克隆为新的conda create --name new_env --clone base,然后激活“new_env”,我将无法再使用 Conda,并且它会警告我,就像 conda 不存在一样。警告如下。

'conda' is not recognized as an internal or external command.
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

然而,在 Anaconda 中,在 conda oneAPI 上训练任何 DNN 模型都比在 conda 上训练快 30%,并且在数据预处理任务中也有更好的性能。我真的很想在 Conda OneAPI 环境中始终使用 Python 的优势,就像在 Anaconda 中使用普通 Conda 一样。那么,如何将它们合并为一个,以便于使用,或者如何解决oneAPI工具包的Conda环境问题

python anaconda conda intel-oneapi

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

如何在 SYCL parallel_for(内核)内部打印?

我正在开发与 oneAPI 基础套件一起提供的 vectorAdd 示例应用程序。当我尝试在内核中打印总和时,出现以下错误。

请查看附件中的源代码以及编译时的错误。

//Source code 

    cgh.parallel_for<class VectorAdd>(num_items, [=](id<1> wiID) {
        sum_accessor[wiID] = addend_1_accessor[wiID] + addend_2_accessor[wiID];

        std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;  // I want to print this sum

        });
Run Code Online (Sandbox Code Playgroud)

在编译期间我收到以下错误。

 //Error generated while compiling

usr/lib/gcc/x86_64-linux-gnu/7.4.0/../../../../include/c++/7.4.0/bits/ostream.tcc:359:25: error: SYCL kernel cannot have a class with a virtual function table
  extern template class basic_ostream<char>;
                        ^
vector-add.cpp:159:6: note: used here
            std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;
            ^
vector-add.cpp:159:11: error: SYCL kernel cannot use a global variable
            std::cout<<"Sum : "<<sum_accessor[wiID]<<std::endl;
Run Code Online (Sandbox Code Playgroud)

sycl intel-oneapi dpc++

3
推荐指数
1
解决办法
2419
查看次数

英特尔 oneAPI 与旧版 Parallel Studio XE 相比的优势(Fortran 用户)

我对数值模型进行编程,以串行和并行方式(使用 MPI)在 Fortran 中求解偏微分方程。只有 Fortran,我不知道/不需要其他语言。我发现在使用 Parallel Studio XE 2019 之前,我现在需要迁移到 Intel OneAPI。迁移到 OneAPI 后,Fortran 普通用户会享受到什么优势/新功能吗?我从未使用过 GPU,如果将来我想学习如何并行化代码并在 GPU 上运行它,OneAPI 会让转换变得更容易吗?

parallel-processing fortran mpi intel-oneapi

3
推荐指数
1
解决办法
696
查看次数

sycl/dpc++ 访问器与内核函数对象中的 global_ptr

使用英特尔 OneAPI beta6 的以下玩具代码。

#include <CL/sycl.hpp>
#include <iostream>

namespace sycl = cl::sycl;

const int SIZE=1;

class Increment_accessor {
  public:
    Increment_accessor(sycl::accessor<int, 1, sycl::access::mode::read_write, sycl::access::target::global_buffer> ptr_) : ptr {ptr_} {}
    void operator()(sycl::item<1> item) {
      ptr[item.get_linear_id()]++;
    }
  private:
    sycl::accessor<int, 1, sycl::access::mode::read_write, sycl::access::target::global_buffer> ptr;
};

class Increment_pointer {
  public:
    Increment_pointer(sycl::global_ptr<int> ptr_) : ptr {ptr_} {} 
    void operator()(sycl::item<1> item) {
      ptr[item.get_linear_id()]++;
    }
  private:
    sycl::global_ptr<int> ptr;
};

int 
main(int argc, char *argv[])
{
  sycl::device dev = sycl::default_selector().select_device();
  sycl::queue q(dev);
  int hbuffer[SIZE] = {};

  {
    sycl::buffer<int, 1> …
Run Code Online (Sandbox Code Playgroud)

sycl intel-oneapi dpc++

2
推荐指数
1
解决办法
336
查看次数

子例程可以包含在 Fortran 中的子例程(而不是程序中)中吗?

我必须处理一个用 Fortran 编写的旧软件(主要是在 70 年代编写的,并且在 3 年前维护得很差)。

我正在尝试使用 VS2017 和 Intel oneAPI 编译器(Fortran Compiler Classic 2021.3.0)为 64 位架构编译它。

在更新其中一个模块的过程中,我说服自己编译器不支持我所了解的在子程序之间称为“主机关联”的内容(通过 CONTAINS 语句)。包含子例程中定义的所有符号似乎在所包含的子例程中都不可见(如果我在包含的子例程中使用声明非常错误并且与包含子例程中的声明不匹配。打印了许多误导性的错误消息)。

你们中有人可以确认是这种情况或提供编译器选项来启用某些编译器过去明确允许的功能吗?如果需要,我会发布源代码(我不会立即发布它,因为我认为这对于 Fortran 专家来说可能是一个非常幼稚的问题,而我完全是个新手)。

真挚地,

在这里,我根据评论中的要求补充原始帖子

原始代码:

Subroutine LoadUserLibs(TypesInDeck,*) 

... OMITTED COMMENTS ...

! This routine is only used in the multi-DLL configuration (otherwise empty routine)

!dec$ if defined (TRNSYS_MULTI_DLL)

 Use DFWIN
 Use DFLIB
 !Use KERNEL32
 Use TrnsysConstants
 Use TrnsysFunctions
 Use TrnsysData, Only: steamMethod,isNISTSteamFound

! Force explicit variable declaration
 Implicit None
! Local variable declarations
 Type(T_WIN32_FIND_DATA):: WFD
 Character (len=maxPathLength) UserDir,FoundListStr,SearchListStr …
Run Code Online (Sandbox Code Playgroud)

fortran contains subroutine visual-studio-2017 intel-oneapi

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

使用 Intel oneAPI DPC++ 编译器将 OpenMP 卸载到 NVIDIA GPU

我的任务是编写一个通过 OpenMP 卸载到 GPU 的程序。目前我使用 Intel oneAPI DPC++ 编译器编译我的代码icpxv2022.1.0 编译代码,目标是在后端使用 NVIDIA Tesla V100。请在下面找到我的相关部分Makefile

MKLROOT   = /lustre/system/local/apps/intel/oneapi/2022.2.0/mkl/latest

CXX       = icpx
INC       =-I"${MKLROOT}/include"
CXXFLAGS  =-qopenmp -fopenmp-targets=spir64 ${INC} --gcc-toolchain=/lustre/system/local/apps/gcc9/9.3.0
LDFLAGS   =-qopenmp -fopenmp-targets=spir64 -fsycl -L${MKLROOT}/lib/intel64
LDLIBS    =-lmkl_sycl -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lsycl -lOpenCL -lstdc++ -lpthread -lm -ldl

${EXE}: ${OBJ}
    ${CXX} ${CXXFLAGS} $^ ${LDFLAGS} ${LDLIBS} -o $@
Run Code Online (Sandbox Code Playgroud)

该代码编译时没有错误和警告,但我不完全确定它在运行时确实使用了 GPU。

  1. 我如何验证这一点?我可以使用 Intel 或 NVIDIA 分析器来检查吗?
  2. 我的假设是否正确,即英特尔编译器支持卸载到 NVIDIA GPU?
  3. 或者我应该更好地使用 NVIDIA 编译器来启用 OpenMP 卸载到 NVIDIA 显卡?

gpu nvidia openmp offloading intel-oneapi

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

DPC++ &amp; MPI、缓冲区、共享内存、变量声明

我是 DPC++ 的新手,我尝试开发一个基于 MPI 的 DPC++ 泊松解算器。我读了这本书,对缓冲区和指针与共享或主机内存感到非常困惑。这两件事有什么区别,我开发代码时应该使用什么。

现在,我使用由具有 const 大小的 std::array 初始化的缓冲区作为串行代码,并且效果良好。然而,当我将 DPC++ 代码与 MPI 耦合时,我必须为每个设备声明本地长度,但我没有这样做。这里我附上我的代码

    define nx 359
    define ny 359
    constexpr int local_len[2];
    global_len[0] = nx + 1;
    global_len[1] = ny + 1;

    for (int i = 1; i < process; i++)
    {
        if (process % i == 0)
        {
            px = i;
            py = process / i;
            config_e = 1. / (2. * (global_len[1] * (px - 1) / py + global_len[0] * (py - 1) / …
Run Code Online (Sandbox Code Playgroud)

c++ mpi sycl intel-oneapi dpc++

0
推荐指数
1
解决办法
187
查看次数