-1

単純なキー生成の例でマルチスレッドを使用する方法を学んでいます。キーの 1 つをインクリメントして元のキーと比較するハッシュキー マッチング アルゴリズムを実装しました。2 つのハッシュキーが一致すると停止します。したがって、0xffffffffff の異なるハッシュキーを反復処理して一致を見つける必要があります。このトピックに関するいくつかの msdn を読み、同じ一致する for ループの 8 つのスレッドを、thread_number_offset で開始し、各反復を number_of_threads ずつインクリメントして開始することにしました。スターターコードは次のとおりです。

struct Args{
    Args(char* in_CT, Chunk* in_chunk, int in_thread_id, int in_stride) :
    stride{in_stride},
    input_CT{ in_CT },
    chunk{ in_chunk },
    thread_id{ in_thread_id }{}
    Chunk* chunk;
    char* input_CT;
    int thread_id;
    int stride;
};
void Match(void *args){
    Args *a = (Args*)args;
    a->chunk->MatchCTMP(a->input_CT,a->thread_id,a->stride);
}

for (unsigned int i = 0; i < threads_num; ++i){
    CTTable[i] = new char[0x100];
    ArgsTable[i] = new Args(CTTable[i], &in_chunk, i, threads_num);
    _beginthread(ThreadFunc, 0, ArgsTable[i]);
}

forループを使用した関数は次のとおりです。

void Chunk::MatchCTMP(char* in_dest_CT,int in_thread_id, int in_stride){
        unsigned int i = in_thread_id;
        unsigned int i_end = MAX - i;
        for (; i < i_end; i += in_stride){
            hash[0] = i & 0xff;
            ...
            ...HashFunction(in_dest_CT);//CT is Compare Table
            ...CompareFunction(in_dest_CT, in_source_CT);

        }
    }

すべて問題ありませんが、タスク マネージャー ウィンドウの CPU 負荷は 10 ~ 15% を超えません。また、すべてのコアが実際にロードされるわけではありません。コア 0、2、4、6 はビジーですが、1、3、5、7 はビジーです。CPUコアの最大数で一定の反復を行うと、CPUがすぐにフル機能でロードされるはずだと思いました。なぜそれが起こっているのですか?私がやったことよりもはるかに複雑ですか?

4

1 に答える 1