在 2D(和 3D)中有效地旋转矢量

计算科学 线性代数 C++ 蒙特卡洛 布拉斯 库达
2021-12-27 10:43:52

我需要在 CUDA 内核中有效地旋转 2D(和 3D)向量。我正在考虑生成随机的单一旋转矩阵。我不需要知道角度,它只需要随机分布。

是否有一些巧妙的方法可以避免除法的计算复杂性和范数的平方根?或者另一种旋转矢量的方法?

我需要它来进行 2D GPU 非晶格蒙特卡罗模拟,但 3D 解决方案也不错。

提前致谢。

1个回答

Mathworld上列出了一些用于 3D 随机旋转的标准方法(球点拾取) 。在 CPU 上,Marsaglia 的方法非常有效,因为它避免了昂贵的计算。sincos

Marsaglia 的方法并不真正适合 GPU,因为它有时会拒绝成对的随机数。如果您可以访问快速三角函数,那么上面链接页面上的等式 (6) 到 (8) 的方法可能效果更好。

2D 中的圆点拾取更简单。无论如何,我认为您无法避免矢量范数/平方根的计算,这通常在硬件中实现。绘制随机数或计算三角函数的成本可能要高得多。