在CUDA函数类型限定符中__device__
,__host__
可以一起使用,在这种情况下,将为主机和设备编译函数.这允许消除复制粘贴.但是,没有__host__ __device__
变数这样的东西.我正在寻找一种优雅的方式来做这样的事情:
__host__ __device__ const double common = 1.0;
__host__ __device__ void foo() {
... access common
}
__host__ __device__ void bar() {
... access common
}
Run Code Online (Sandbox Code Playgroud)
我发现以下代码符合并运行没有错误.(所有结果均在Ubuntu 14.04上获得,CUDA 7.5和gcc 4.8.4作为主编译器)
#include <iostream>
__device__ const double off = 1.0;
__host__ __device__ double sum(int a, int b) {
return a + b + off;
}
int main() {
double res = sum(1, 2);
std::cout << res << std::endl;
cudaDeviceReset();
return 0;
}
$ nvcc main.cu …
Run Code Online (Sandbox Code Playgroud) 我正在经历一种对我来说没有意义的奇怪行为.以下程序(我试图将其减少到最小的例子)崩溃NullPointerException
因为Bar.Y
是null
:
$ javac *.java
$ java Main
FooEnum.baz()
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:6)
Run Code Online (Sandbox Code Playgroud)
我希望它打印:
FooEnum.baz()
Bar.qux
Run Code Online (Sandbox Code Playgroud)
但是,如果Bar.qux
首先访问(可以通过取消注释main方法的第一行或通过重新排序以下两行来完成),程序将正确终止.
我怀疑这个问题与Java类初始化顺序有关,但我无法在相关的JLS部分找到任何解释.
所以,我的问题是:这里发生了什么?这是某种错误还是我错过了什么?
我的JDK版本是1.8.0_111
interface Bar {
// UPD
int barF = InitUtil.initInt("[Bar]");
Bar X = BarEnum.EX;
Bar Y = BarEnum.EY;
default void qux() {
System.out.println("Bar.qux");
}
}
enum BarEnum implements Bar {
EX,
EY;
// UPD
int barEnumF = InitUtil.initInt("[BarEnum]");
}
interface Foo {
Foo A = FooEnum.EA;
Foo B = FooEnum.EB;
// …
Run Code Online (Sandbox Code Playgroud)