【发布时间】:2021-06-03 18:29:42
【问题描述】:
我正在尝试从 sycl 内核内部访问一个全局变量。使用此模式的代码及其输出如下。
#include<CL/sycl.hpp>
using namespace sycl;
int g_var = 22;
int * const g_ptr = &g_var;
int main() {
queue q{host_selector{}};
g_var = 27;
std::cout<<"global var changed : " <<g_var<<" "<<*g_ptr<<"\n";
q.submit( [=] (handler &h) {
stream os(1024, 128, h);
h.single_task([=] () {
os<<"global var : "<<*g_ptr<<"\n";
});
}).wait();
return 0;
}
它的输出如下。
$$ dpcpp test.cpp; ./a.out
global var changed : 27 27
global var : 22
即使 g_var 被更改为 27,它在内核中还是以 22 的初始值打印出来的。这是预期的行为吗?
通常 lambdas 不会创建全局变量的副本。 dpc++ 编译器是在设备内部创建全局变量的副本还是在编译期间传播常量值以便在运行时不访问全局内存?
【问题讨论】:
标签: sycl intel-oneapi dpc++