5

私は最近 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

再びメモリを分離する必要があり、お互いについて何も知らないかのように動作する必要があります..しかし、この条件を削除し、両方のループですべてのキューブを実行すると、エラーが解消されます

4

3 に答える 3

0

気付いていないマルチスレッドまたはメモリ破損の問題があると思われます。あなたが説明する動作は、標準的な設計上の望ましい動作ではありません。

于 2009-04-27T22:16:57.717 に答える