我正在做一个用Java完成的业务项目,需要巨大的计算能力来计算业务市场。简单的数学运算,但包含大量数据。
我们订购了一些cuda gpu进行尝试,并且由于cuda不支持Java,我想知道从哪里开始。我应该建立一个JNI接口吗?我应该使用JCUDA还是其他方法?
我没有这方面的经验,我想如果有人可以指导我一些事情,以便我可以开始研究和学习。
首先,你应该意识到CUDA不会自动加快计算速度这一事实。在一方面,由于GPU编程是一门艺术,它可以是非常,非常具有挑战性得到它的权利。另一方面,因为GPU仅适合某些类型的计算。
这听起来可能令人困惑,因为你基本上可以在GPU上进行任何计算。关键当然是你是否会实现良好的加速。这里最重要的分类是问题是任务并行还是数据并行。粗略地说,第一个是指多个线程正在或多或少地独立执行各自任务的问题。第二个问题涉及许多线程都在做相同的事情 -但是在数据的不同部分上的问题。
后者就是GPU擅长的问题:GPU有很多内核,所有内核都做同样的事情,但是在输入数据的不同部分上运行。
你提到你拥有“简单的数学但有大量数据”。尽管这听起来像是一个完美的数据并行问题,因此很适合GPU,但还需要考虑另一个方面:GPU的理论计算能力(FLOPS,每秒浮点运算)非常快。但是它们经常受内存带宽的限制。
这导致了另一种问题分类。即问题是受内存限制还是受计算限制。
第一个是针对每个数据元素执行的指令数量很少的问题。例如,考虑并行向量加法:你必须读两个数据元素,然后进行单次加入,然后写将总和结果向量。在GPU上执行此操作时不会看到加速,因为单次添加不会补偿读取/写入内存的工作量。
第二个术语“计算边界”是指指令数量比存储器读/写数量多的问题。例如,考虑矩阵乘法:当n是矩阵的大小时,指令数将为O(n ^ 3)。在这种情况下,可以预期GPU在某种矩阵大小下的性能将超过CPU。另一个示例可能是在“少量”数据元素上执行许多复杂的三角计算(正弦/余弦等)时。
根据经验:你可以假设从“主” GPU内存中读取/写入一个数据元素的延迟大约为500条指令…。
因此,GPU性能的另一个关键点是数据局部性:如果你必须读取或写入数据(在大多数情况下,你必须; ;-)),则应确保数据保持尽可能近的距离。可能的GPU核心。因此,GPU具有某些内存区域(称为“本地内存”或“共享内存”),通常只有几KB大小,但是对于将要包含在计算中的数据特别有效。
因此,再次强调这一点:GPU编程是一门艺术,它仅与CPU上的并行编程密切相关。Java中的诸如Threads之类的东西,以及诸如等等的所有并发基础结构ThreadPoolExecutors,ForkJoinPools可能给人的印象是,你只需要以某种方式拆分工作并将其分配到多个处理器中即可。在GPU上,你可能会遇到更低的挑战:占用率,寄存器压力,共享内存压力,内存合并……仅举几例。
但是,当你要解决数据并行,计算受限的问题时,GPU是你的最佳选择。
一般说明:你特别要求CUDA。但我强烈建议你也了解一下OpenCL。它有几个优点。首先,它是独立于供应商的开放行业标准,并且由AMD,Apple,Intel和NVIDIA实施OpenCL。此外,在Java世界中,对OpenCL的支持更加广泛。我更愿意使用CUDA的唯一情况是,当你想使用CUDA运行时库时,例如CUFFT用于FFT或CUBLAS用于BLAS(矩阵/矢量运算)。尽管有为OpenCL提供类似库的方法,但是除非你为这些库创建自己的JNI绑定,否则不能直接从Java端使用它们。
问题内容: 我在Android的OpenGL-ES 3.0中使用的工作代码如下所示: 我的问题是在第三行上将结果转换为to 。被声明为返回一个: 在我的测试平台上,该函数返回的子类,因此强制转换有效,但对于支持OpenGL-ES 3+的所有平台或Android版本进行此假设似乎并不十分安全。尽管看起来很合理,但我还没有找到任何可以保证它的文档,如果可以保证,似乎应该将该函数声明为returning
本文向大家介绍groovy 在Java项目上使用Groovy,包括了groovy 在Java项目上使用Groovy的使用技巧和注意事项,需要的朋友参考一下 示例 Groovy可以访问所有Java类,实际上Groovy类是Java类,可以直接由JVM运行。如果您正在从事Java项目,那么使用Groovy作为一种简单的脚本语言来与Java代码进行交互就变得很容易了。 为了使事情变得更好,几乎所有Jav
我用那个代码来控制我的android设备剪贴板,但是它给了我错误。我在远程设备Android6.0上测试这段代码。这是我的错误 Oct 06,2018年7:47:01 AM org.openqa.selenium.remote.errorcodes to status info:HTTP status:“404”->线程“main”org.openqa.selenium.unsupportedCo
问题内容: 如何获取片段中的上下文? 我需要用我的数据库其构造函数采用的背景下,但并没有工作,所以我能做些什么? 数据库构造函数 问题答案: 你可以使用,返回与关联的活动。 活动是(自扩展以来)。
问题内容: Scenerio:我想通过ssh从Java程序在远程机器上运行命令(我在开发机器上使用OpenSSH)。我也想通过传递密码来建立ssh连接,而不是像使用“期望”那样设置密钥。 问题:尝试执行“期望”之类的密码登录时,使用ProcessBuilder创建的流程似乎看不到密码提示。当运行常规的非ssh命令(例如’ls’)时,我可以获取流并与它们进行交互。我将标准错误和标准输出合并为一个流因
问题内容: 与此处类似的问题,但在此处没有足够的评论要点。 根据最新的Spark 文档,可以两种不同的方式使用,一种用于SQL,另一种用于DataFrame。我找到了多个如何与sql 一起使用的示例,但还没有找到有关如何直接在DataFrame上使用a的任何示例。 op所提供的解决方案,在上面链接的问题上使用,根据Spark Java API文档,该解决方案将在Spark 2.0中删除。在那里,它