我正在做一个用Java完成的业务项目,需要巨大的计算能力来计算业务市场。简单的数学运算,但包含大量数据。
我们订购了一些cuda gpu进行尝试,并且由于cuda不支持Java,我想知道从哪里开始。我应该建立一个JNI接口吗?我应该使用JCUDA还是其他方法?
我没有这个领域的经验,我想如果有人可以指导我一些事情,以便我可以开始研究和学习。
最佳答案
首先,您应该意识到CUDA不会自动加快计算速度这一事实。一方面,由于GPU编程是一门艺术,正确地实现它可能非常非常具有挑战性。另一方面,因为GPU仅适合某些类型的计算。
这听起来可能令人困惑,因为您基本上可以在GPU上进行任何计算。关键当然是您是否会实现良好的加速。这里最重要的分类是问题是任务并行还是数据并行。粗略地说,第一个是指多个线程正在或多或少地独立执行各自任务的问题。第二个问题涉及许多线程都在做相同的事情-但是在数据的不同部分上的问题。
后者是GPU擅长的一种问题:它们具有许多内核,并且所有内核都执行相同的操作,但是在输入数据的不同部分上运行。
您提到您拥有“简单的数学但有大量数据”。尽管这听起来像是一个完美的数据并行问题,因此非常适合GPU,但仍需要考虑另一个方面:GPU的理论计算能力(FLOPS,每秒浮点运算)非常快。但是它们经常受内存带宽的限制。
这导致了另一种问题分类。即问题是受内存限制还是受计算限制。
第一个是针对每个数据元素执行的指令数量很少的问题。例如,考虑并行向量加法:您必须读取两个数据元素,然后执行一次加法,然后将总和写入结果向量。在GPU上执行此操作时不会看到加速,因为单次添加不会补偿读取/写入内存的工作量