#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 и изучить основы. Тогда, обладая некоторым твердым пониманием, вы будете готовы подойти к этой проблеме.