小编wot*_*pul的帖子

CUDA __host__ __device__变量

在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)

c++ cuda gpgpu nvcc

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

Java接口静态变量未初始化

我正在经历一种对我来说没有意义的奇怪行为.以下程序(我试图将其减少到最小的例子)崩溃NullPointerException因为Bar.Ynull:

$ 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)

java initialization java-8

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

标签 统计

c++ ×1

cuda ×1

gpgpu ×1

initialization ×1

java ×1

java-8 ×1

nvcc ×1