C++:どのようにできるデータを読み込むに影響することがメモリ?
-
18-09-2019 - |
質問
まわっているんだとC++最近では、私のバグと思います。
私はベクターオブジェクトの各オブジェクトを含むベクターのfloat.そのために作成さらに平坦な配列を含むすべてのfloat値のすべてのオブジェクトです。ちょっとよりもはるかに複雑ですが、要旨の問題は私のループを通して物体抽出のためのfloat値ある時点での私のベクトルのオブジェクトの変更、または破損があった。私の読み込み操作はすべて定数の機能)
別の例としたMPI.い始めたころだっ同じコードを二つの異なるノードを自分の記憶のないデータ転送に起きて、非常に簡単です。驚いた分割誤差および後の時間追跡、その一課題の一変数の設定に異なる変数をNULLになります。
私が興味のある人は、どのようにできることを読み込み操作に影響することが私のデータ構造です。同様にどのように、一見関係のない動作には影響します。なかった見解は私の問題とその簡単な説明がアドバイスするぞよろしくお願い申し上げます。
更新:こちらはセグメントのコードでは、なかった後のものとなっていますので確認ができますどのくらいから抽出した理解せずに全体のシステム。
一つだけ見つかり出ていたことはありま報、価値を、自平配列かcout投稿内容の投稿者にその代わりに、ワンセグ誤差はなくなった。うん宣言っ配列に違いがもったいどのような影響を与えるのかオブジェクトベクトルとなっています。
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
私の平に配列した会員機能
float * flatFitness;
initailsedのコンストラクタはこのように:
flatFitness = new float(popSize);
更新2:
いうのは、ジャンムー-カシミール挙動とは関係のない、最初は多部です。第MPIの例では、技術的には、計画投資省は分散メモリおよび意図的な試みの最も単純な実装を考えついたことは、機械の走行コード。がしかし一キーワードを入れているcondtionalい
if node 1 then do bottom half of loop
if node 1 then do top half
再度、メモリは離れるべきとして働く場合も知らないます。が除去にこの条件は、どこに、どのようなものがあるかループ全てのキューブのエラーを解消
解決
この配列のコンストラクタ:
float * flatFitness;
flatFitness = new float(popSize);
いつのfloatのヒープここでは、初期化された値 popSize
.したい場合はfloat配列を使用する必要があり括弧で括弧:
float *flatFitness = new float[popSize];
このすることができるので問題について説明していただけま.また、記憶を作成する場合配列に必要なものを削除 delete []
(後):
delete [] flatFitness;
まだ利用 delete
, でも、その動作は定義されていません。
したい場合は使用をやめる配列の構文全体的に見て、活用してみませんか std::vector
?を作成できベクトルのpopSize要素のようになります:
#include <vector>
std::vector<float> flatFitness(popSize);
このまま解放される場合は自動的にその範囲んで心配 new
または delete
.
Update(re:コメント): だが既に使用 std::vectors
他のコードでこれらを実現するために、 std::vector::swap()
.が回避できるのでコピーも一体となっただけのスワップカップルでベクトル間を往復バッファリングのためのCUDAの処理をやっている。
他のヒント
私はあなたが気づいていない、マルチスレッドやメモリ破損の問題を抱えている疑いがあります。あなたが記述動作はバイ・デザイン、標準の任意の並べ替えではないが、望ましい行動ます。
jeffamaphoneが、これは、スレッドの問題であることを正しいかもしれません。別の可能性はあなたが読んでいるオブジェクトがすでに削除されているということです。その後、無効なアドレスから読み込むことになります。それはあなたがこの時点でに書いているデータ構造はベクトルが以前占有同じ場所に格納されていることも可能です。これは、あなたが記述している動作になるでしょう。
編集(お使いの更新に基づく):
stringLength
は、外側のループの外で初期化されますが、それはその外側のループの中に更新する必要があるように見えます::この問題がある可能性があります。
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
推奨修正ます:
for (int i=0;i<pop->GetPopSize();i++) {
int stringLength = pop->GetGenome(i).GetLength();
for (int j=0;j<stringLength;j++) {
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
}