私は最近 C++ に深く入り込んでおり、私のバグは複雑になっているようです。
オブジェクトのベクトルがあり、各オブジェクトにはフロートのベクトルが含まれています。すべてのオブジェクトのすべての float 値を 1 つに含む、さらにフラットな配列を作成する必要があると判断しました。それよりも少し複雑ですが、問題の要点は、float 値を抽出するオブジェクトをループすると、ある時点でオブジェクトのベクトルが変更されたり、奇妙な方法で破損したりすることです。(私の読み取り操作はすべて const 関数です)
もう 1 つの例は、MPI の場合です。私は始めたばかりだったので、まったく同じコードを2つの異なるノードで実行したかっただけで、独自のメモリがあり、データ転送は発生していません。すべて非常に簡単です。驚いたことに、セグメンテーション エラーが発生し、何時間も追跡した後、1 つの変数の 1 つの割り当てがまったく別の変数を NULL に設定していることに気付きました。
ですから、読み取り操作がデータ構造にどのように影響する可能性があるのか 、興味があります。同様に、一見無関係な操作が別の操作にどのように影響するか。これらの簡単な説明では問題の解決策を期待できませんでしたが、アドバイスをいただければ幸いです。
更新: これはコードの一部です。システム全体を理解していないと、コードからどれだけ抽出できるかがわからないため、最初は投稿しませんでした。
ただ、フラットな配列に値を代入するのをやめて、代わりに計算すると、セグメントエラーが消えたことがわかりました。したがって、配列が間違っていると宣言している可能性がありますが、そうであったとしても、それがオブジェクト ベクトルにどのように影響するかはわかりません。
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;
次のようにコンストラクターで初期化されます。
flatFitness = new float(popSize);
更新 2:
上記の 2 つの例は関連がなく、最初の例はマルチスレッドではありません。2 番目の MPI の例は技術的なものですが、MPI は分散メモリであり、考えられる最も単純な実装を意図的に試みました。これは、両方のマシンが独立してコードを実行するというものです。ただし、追加の詳細が1つあります。条件付きの言葉を入れました
if node 1 then do bottom half of loop
if node 1 then do top half
再びメモリを分離する必要があり、お互いについて何も知らないかのように動作する必要があります..しかし、この条件を削除し、両方のループですべてのキューブを実行すると、エラーが解消されます