4

私は、既存の混合 Python/C++ 数値コードベースを混合 Scala/C++ (長期的には理想的にはほぼ Scala) に変えるには何が必要かを調査しています。最大の問題は、構造体のパックされた配列であると予想しています。たとえば、C++ には次のような型があります。

Array<Vector<double,3>> # analogous to double [][3]
Array<Frame<Vector<double,3>>> # a bunch of translation,quaternion pairs

これらは、Numpy のおかげで、コピーせずに Python と C++ の間で相互に変換できます。

JVM では、ボックス化されていない配列はほんの一握りの型しか持てないため、(1) 構造体ごとにボックス化された Scala 型を作成し、(2)何を知っているVector<double,3>型付きの薄いラッパーを作成することしか考えられません。Array[Double]構造体であり、必要に応じてボックス化されたシングルトンを作成/消費します。

そのようなことを行う、または構造体のパック配列の代替手段を実装する既存のライブラリはありますか? パフォーマンス文字がどうなる可能性が高いか、および既存のコンパイラと JVM が少なくとも非ポリモーフィックな密閉されたケースでボックスを最適化できるかどうかについて、経験のある人はいますか?

パッキングとナイス タイピングはオプションではないことに注意してください。パッキングがないと、すぐにメモリを吹き飛ばしてしまいます。Array[Double] しかない場合は、(残念ながら) C++ の型システムが優先されます。

4

1 に答える 1

3

問題は、そこに数字以外の何かがあるかどうかです。double の山だけの場合は、Scala でラッパーを作成できますが、ボクシングを避けることを当てにするべきではありません。代わりに、変更可能なラッパーを作成することを検討してください。

trait Vec3 {
  def x: Double
  def y: Double
  def z: Double
}
class ArrayedVec3(array: Array[Double]) extends Vec3 {
  private[this] var index = 0
  def goto(i: Int) = { index = i*3; this }
  def x = array(index)
  def y = array(index+1)
  def z = array(index+2)
}

効率ではなく使いやすさが必要な場合は、ArrayedVec3 を実装しIterator、それ自体を として返すか、その他のさまざまなことを行うことができます。next

ただし、重要なのは、これらのアダプターの作成と移動を自分で管理する意思がある場合は、ボックス化について心配する必要がないということです。「ボックス」を一度作成するだけで、必要な場所に移動します。

C++ の最大 2 倍のパフォーマンスに満足しており、シングル スレッドでの使用を目指している場合は、これでうまくいくはずです。(過去に私のために働いていました。)

于 2012-11-05T08:17:16.027 に答える