Ошибка при попытке реализовать parallel_for c 11: ошибка приращения C3019 в операторе OpenMP ‘for’ имеет неправильную форму

#c #c 11 #optimization #parallel-processing

#c #c 11 #оптимизацию #параллельная обработка

Вопрос:

я пытаюсь оптимизировать генетический алгоритм, однако при параллельном использовании #pragma omp алгоритм работает отлично. Когда я меняю это на #pragma omp parallel for , я получаю сообщение об ошибке C3019: приращение в операторе OpenMP ‘for’ имеет неправильную форму. метод, который я пытаюсь оптимизировать, является:

 vector<unsigned int> decode(genome amp;gen)
{
    auto num_threads = thread::hardware_concurrency();
    static vector<unsigned int> this_gene(gen.gene_length);
    vector<unsigned int> decoded(NUM_CHARS);

#pragma omp parallel for num_threads(num_threads)

        for (unsigned int gene = 0, count = 0; gene < gen.bits.size(); gene  = gen.gene_length,   count)
        {

            for (unsigned int bit = 0; bit < gen.gene_length;   bit)
                this_gene[bit] = gen.bits[gene   bit];

            unsigned int val = 0;
            unsigned int multiplier = 1;

            for (unsigned int c_bit = this_gene.size(); c_bit > 0; --c_bit)
            {
                val  = this_gene[c_bit - 1] * multiplier;
                multiplier *= 2;
            }
            decoded[count] = val;
        }
    return decoded;
}
 

Комментарии:

1. Ваше for утверждение не соответствует требованиям канонической формы цикла OpenMP. Спецификации OpenMP находятся по адресу openmp.org/wp/openmp-specifications и расскажет вам, каковы эти требования. Я уверен, что тщательный поиск SO также прояснит этот вопрос.

2. я очень новичок во всем этом, и это не мой алгоритм, который я оптимизирую, однако, исходя из моего понимания спецификации OpenMP, #pragma omp параллелен для (gene, bits, decoded)… иду ли я по правильному пути?

3. Я думаю, ты откусываешь гораздо больше, чем можешь прожевать. Лучший совет, который я могу предложить, — это начать работать с гораздо более простыми программами OpenMP и изучить основы. Тогда, обладая некоторым твердым пониманием, вы будете готовы подойти к этой проблеме.