ベクトルのベクトルによって非常に長い行列を記述する。どの次元が最大であるべきか?

私は、要素がユーザー定義のクラスである大きな行列を使用するコードを書いています。この行列を作るために、私は次のベクトルのベクトルを使います。

using namespace std;
vector< vector< userclass > > matrix = vector >(sizeX, vector(sizeY));

このクラスは構造体でもあり、floatやポインタなどの組み込み関数をいくつか含んでいます。だからここには事がある: 行列のサイズが一方向に2000、他方のサイズが20であるとしますが、どちらを選択するかは自由です。最高のパフォーマンスを得るには、どれを最大にする必要がありますか sizeX sizeY ですか?

言い換えれば、どちらが速いか、大きなベクトルの小さなベクトルか、小さなベクトルの大きなベクトルか。違いはありますか?

パフォーマンスの最適化は、単一ランダムアクセスにする必要があります。

1
ブーストの多次元配列ライブラリを見てみると、メモリを使いやすくするだけでなく、標準的な繰り返しやその他の細かい点もあります。 boost.org/doc/libs/1_48_0/libs/multi_array/doc/user.html
追加された 著者 HostileFork,

2 答え

最小のベクトル数を目指す必要があります。これは、スペースを最小限にとどめるだけでなく、 sizeY sizeX よりも大きくなければならないことを意味します。


もちろん、どのように使用するかによって異なります。できるだけ長くベクトルにアクセスしようとすると、 vec [i] [j] vec [j] [i] よりもはるかに優れています。 vec [j] [i] を実行する必要がある場合は、 sizeX の方が大きければパフォーマンスが向上します。

Fastest iterating where sizeX > sizeY:

for(int i...)
for(int j...) {
  vec[i][j];
}
4
追加された
それらが使用される方法は、一度作成されセットアップされる(時間に敏感な操作ではない)場合、マトリックスは読み取られるだけです(書き込まれません)。実行時には、一度に1つの要素にアクセスされますが、どの要素が読み込まれるかを制御することはできません。その要素が順次になると仮定する理由はありません。それでも、あなたが言ったことに従えば、いくつかの大きなベクトルを持つことで、同じベクトルが繰り返しアクセスされる可能性が増します(20に1にすぎない場合でも)。
追加された 著者 Malabarba,

ここではさまざまなことを考慮する必要があります。まず、 sizeX * sizeY サイズのデータ​​の単一ベクトルを保持する独自の行列型を定義する方が、座標をベクトル内の要素の位置 この手法の利点は、メモリフットプリントがよりコンパクト(メモリの使用量が少ない 1 )で、メモリが連続していることです。

そのマッピングをどのように行うべきか、そして主にパフォーマンスを考慮すると、データの使用法に依存します。あなたが特定の方向に反復しようとしている場合、その方向の連続した要素をメモリ内の連続した位置にしたいとします(つまり、Y上の外部ループとX上の内部ループで反復しようとすると、 pos = y * sizeX + x にする必要があります。

1 Assuming that the type takes 10 bytes, a vector of 2000 vectors of 20 elements takes (2000+1)*sizeof(vector) + 2000*20*10 bytes, a vector of 20 vectors of 2000 elements will take approximately (20+1)*sizeof(vector) + 2000*20*10 bytes, and a single vector of 2000*20 elements takes sizeof(vector)+2000*20*10 bytes. Roughly in a 64bit platform in release with no extra debugging information, sizeof(vector) ~ 3*8 (i.e. 24 bytes), and the totals would be: 448024, 400504 and 400024 bytes. That might not make that much of a difference, but in the first case there is an extra 10% memory in use, compared to the optimal case.

0
追加された