我最近与Java 8取得联系,我正在尝试学习Lambda表达式。 我想做一些图形计算,到目前为止我的代码:
IntStream.range(0, (screenSize.width * screenSize.height)).parallel().forEach(id -> {
int x = id % screenSize.width;
int y = ((id-x) / screenSize.width);
/*look up what color this pixel is.*/
});
现在所有这些代码都是针对图形的,所有内容都是基本的数学(加,减,乘,模),bufferedImage.getRGB(x, y)
和java.awt.Color
的操作除外,它可以分别为每个像素完成。
现在的问题是:可以在GPU上运行吗?或者这甚至是基于GPU的? (我记得在某个地方看过这个,但我不确定)
答案 0 :(得分:10)
JavaVM实现可以自由地实现Java字节码解释,但只要结果正确就可以。它可以随意在GPU上运行任何东西。但是,我不知道目前正在执行此操作的任何Java实现。有一个项目可以为OpenJDK添加GPU加速(Project Sumatra),你猜对了:它专注于流API,因为它旨在编写可以并行化的代码。但目前这还远没有准备就绪,目前似乎没有人在研究它。
如果你想今天从Java程序在GPU上运行计算,你需要一个库,它使用Java Native Interface包装像OpenCL这样的GPU计算API(对于OpenCL,有JOCL)。准备好学习一种新的编程语言,因为每个GPU计算API都使用不同语言的指令,而且它们都与Java非常相似。
答案 1 :(得分:1)
这取决于你在做什么。如果那些真的是一般的并行计算,那么连接像OpenCL这样的GPGPU可能会有其好处,即使集成它也不容易。
然而,正如你所说,你正在进行图形计算。这是着色器的设计目标。每个顶点运行一次顶点着色器,然后剪切看不见的元素,然后将场景分割成片段(每个像素的大小),然后通过片段着色器运行每个片段。
我曾经使用过GLSL,所以我可以告诉你的代码在着色器中看起来很简单。通过插入顶点坐标(即varying
变量如何工作),在顶点和片段着色器之间计算每个片段的X和Y,纹理采样通过texture2d
函数完成。
答案 2 :(得分:0)
有一个研究项目[1]正是这样做的。它是JVM(实际上是Graal VM)的扩展,用于在运行时从字节代码生成C OpenCL代码。