SYCL 程序使用 VS 调试器工作,但在 运行 .exe 时不工作

SYCL program working using VS Debugger but not when running the .exe

我正在尝试构建 运行 来自 this book 的简单 SYCL 程序。在这里:

#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;

const std::string secret {
    "Ifmmp-!xpsme\"2J(n!tpssz-!Ebwf/!"
    "J(n!bgsbje!J!dbo(u!ep!uibu/!.!IBM"
};
const auto sz = secret.size();

int main(int argc, char* argv[]) {
    queue Q;

    char* result = malloc_shared<char>(sz, Q);
    std::memcpy(result, secret.data(), sz);

    Q.parallel_for(sz, [=](auto& i) {
        result[i] -= 1;
        }).wait();

    std::cout << result <<  "\n";

    return 0;
}

我正在使用 Visual Studio 2019,我正在使用 Intel oneAPI DPC++ 2022 进行编译。如果我 运行 Visual Studio 调试器,一切正常,我将获得输出: “Hello World!对不起,Dave。恐怕我不能那样做。- HAL”

但是,如果我正在执行我刚刚从命令提示符生成的 .exe 文件,则什么也没有发生...程序正在自行执行,没有给出任何输出,我也没有收到任何错误。我试图在各处放置一些 printf 以查看问题可能来自何处。如果我把 printf 放在“queue Q;”之后当我 运行 .exe 文件时,我将看不到它。 据我所知,问题出在我的对象 Q 的初始化上。我替换了“队列 Q;”通过“队列 Q(default_selector{});”但是并没有解决问题。


编辑: 我只是将代码简化为以下内容:

#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;

int main(int argc, char* argv[]) {
    std::cout << "Beginning of the program.\n";
    
    queue Q; // The problem appears to come from this line

    std::cout << "End of the program.\n";
    system("pause");
    return 0;
}

这是我在 Visual Studio 调试器中启动程序时的输出:

> Beginning of the program.
> End of the program.
>
> Sortie de C:\Users\...\test.exe (processus 8108). Code : 0.
> Press any key to continue . . .

这是我从命令提示符调用 .exe 时的输出:

> C:\Users\...\Release>test.exe
> Beginning of the program.
>
> C:\Users\...\Release>

我注意到程序在命令提示符中 运行ning 的短时间内(大约一秒钟),我看到程序 Windows 有问题在任务管理器中报告 运行。程序显然完成计算后它就消失了。


编辑 2 : 如果我正在寻找所使用的设备,会发生以下情况。使用以下代码:

#include <CL/sycl.hpp>
#include <iostream>
using namespace sycl;

int main(int argc, char* argv[]) {
    default_selector device_selector;
    std::cout << "default_selector has been defined.\n";

    auto defaultQueue = queue(device_selector);
    std::cout << "default_queue has been defined.\n";
    std::cout << "Running on " << defaultQueue.get_device().get_info<info::device::name>() << "\n";

    system("pause");
    return 0;
}

我从 Visual Studio 调试器得到这个输出:

> Beginning of the program...
> default_selector has been defined.
> default queue has been defined.
> Running on      Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
> Press any key to continue...

当我从命令提示符下执行 .exe 时(无论是否以管理员身份执行此操作都不会改变任何内容):

> C:\Users\...\Release>test.exe
> Beginning of the program...
> default_selector has been defined.
>
> C:\Users\...\Release>

答案已由the Intel Developer Software Forums带来。

虽然我的机器上已经安装好了编译器,但是oneAPI环境还没有配置好。这就是为什么在 Windows 命令提示符下 运行ning .exe 时它无法工作的原因。

我必须 运行 地址为 C:\Program Files (x86)[的批处理文件 setvars.bat\intel\oneAPI 然后成功了!