我正在阅读很多关于 gpgpu 的内容,并且我目前正在学习 OpenGL。现在我必须自己编写所有数学(或使用现有的第 3 方库),我有了使用 gpu 而不是 cpu 来创建自己的数学库的想法。(矩阵向量等)
但我没有找到任何使用 gpu 的 3d 数学库。
有具体原因吗?
也许 CPU 更擅长这些任务?
这取决于您一次要处理多少个向量或矩阵,以及您是否要绘制结果。
GLSL(OpenGL Shading Language)已经内置了一个数学库。它具有矩阵数学、转置、逆运算的函数和运算符;矢量点和叉积;将向量乘以矩阵等。
当您使用 OpenGL 绘制几何图形或其他内容时,您可以在 GPU 上的着色器中使用这些内置函数。在 3d 数学库中复制已经存在的东西是没有意义的。
如果您想在不绘制任何东西的情况下进行小规模矢量/矩阵数学运算,例如射线 - 平面相交测试,那么 CPU 会更好。将值复制到 GPU 并将结果复制回来将比仅在 CPU 上进行数学运算花费更长的时间。(即使 GPU 实际上更快 - 今天的典型速度是 CPU 2Ghz+,GPU < 1Ghz。)这就是数学库只使用 CPU 的原因。
如果您想在不绘图的情况下进行“工业规模”矩阵/矢量数学运算,那么值得考虑 GPU。(这就是 CUDA 和 OpenCL 存在的原因。)使用支持变换反馈和纹理缓冲区对象(通常是 V3+)的现代 OpenGL 版本,您可以在 GPU 上对数百到数千个矩阵/向量进行数学运算,而 OpenGL 4.3 甚至可以做到这一点使用计算着色器更容易。它不如 CUDA/OpenCL 方便或高效,但如果您已经了解 OpenGL,它会容易得多。
希望这可以帮助。
寻找 CUDA 推力作为起点。我认为 GPU 将非常适合这项任务。CPU 上的 SIMD 也可以进行研究,但不会提供您希望的那么多并行性。
你可以试试arrayfire。最多支持4个维度,对常用功能有很多支持。目前仅支持 cuda,但不久将使用相同的界面添加对 opencl 的支持(我在 Accelereyes 工作,所以我知道这一点)。
你想做什么样的操作?您可以将 OpenCL 内置 float4 及其默认运算符(+、-、*、/、点、sqrt)用于 Vector3 或 Vector4。您可以使用四元数和矩阵轻松扩展它,这就是我们所做的。
见http://github.com/erwincoumans/experiments
该代码可以帮助您学习 OpenCL 以及 OpenGL 和 OpenCL-OpenGL 互操作。
我的 github 存储库包含简单的四元数 3d 数学函数、3d 矢量和 3x3 矩阵,用于我们的 3D Bullet 游戏物理库的 OpenCL 版本。它还具有快速基数排序、前缀扫描、碰撞检测算法和刚体动力学,100% 在 GPU 上运行。它可以在 NVIDIA、AMD、Intel Windows 和 Mac OSX 上运行。 https://github.com/erwincoumans/experiments/blob/master/opencl/primitives/AdlPrimitives/Math/MathCL.h