0

私は次のクラスを持っています:

class host_list{
    host_vector<int> id;
    host_vector<int> weight;
    /*...irrelevant functions and variables...*/
    host_list& operator= (const device_list& TheOther );
};

class device_list{
    device_vector<int> id;
    device_vector<int> weight;
    /*...irrelevant functions and variables...*/
    device_list& operator= (const host_list& TheOther );
};

そして私の機能:

void FillSampleData(host_list& dest);//just fills the two vectors with
                // 40-40 members, runs on CPU

int main(void){
    host_list input;
    int result[5]={0};

    FillSampleData(input);

    EvaluateData(input,result);
    /*...etc...*/
}

void EvaluateData(host_list& input,int*& result){
    device_list d_list;

    [1]cudaDeviceSynchronize();
    [2]d_list=input;
    /*...etc...*/
}

入力ベクトルを gpu [2] にコピーするのにおよそ時間がかかったので、最初は何らかのエラーがあると思いました。2分。少し検索した後、gpu グローバル メモリの書き込みは、すべてのカーネルの起動が完了するまで待たなければならないことがわかったので、[1] を追加して、何が起こるかを確認しました。

その結果、[2] は必要な速度で実行されますが、同期回線 [1] は 2 分以上実行されます。

コードが待機している隠しカーネル呼び出しがどこにあるのか、または何が欠けているのか誰か教えてもらえますか (事前初期化について考えていましたが、以前はそのようなことをする必要がなかったので、それがm行方不明)?

4

0 に答える 0