Можно ли преобразовать мой цикл в параллель для вызова fnc? - PullRequest
0 голосов
/ 30 июня 2011

У меня есть цикл for, который я хотел бы преобразовать в параллельный вызов fnc. Мой код соответствует всем критериям (описанным в Parallel_Programming_with_Microsoft_Visual_C_plus_plus, стр.7) для успешного преобразования, но я нахожу его трудно реализовать Вот мой пример:

//"Oridinary" for
//numbers_from_file_ is a vector<Big_Int> loaded with Big_Int 
//results_ is a vector<Big_Int>

for (unsigned i = 0; i < numbers_from_file_.size(); i += 2)//+2 to skip to another pair
{
    results_.push_back( numbers_from_file_[i] * numbers_from_file_[i + 1]);
}

Сценарий состоит в том, что каждая пара чисел из numbers_from_file_ умножается и сохраняется в results_. Чтобы заставить его работать, переменная i должна быть увеличена на два (чтобы перейти к другой паре). К сожалению, пример в этой книге показывает, как преобразовать тело цикла for в параллельный вызов fnc, только если i увеличивается на единицу.
Можно ли преобразовать мой цикл в параллель для вызова fnc?

Ответы [ 3 ]

1 голос
/ 30 июня 2011

MSDN говорит о наличии параметра step.Используйте это.

0 голосов
/ 30 июня 2011

Да, вы можете.Сначала вам нужно изменить размер результатов, а затем добавить к ним.

results_.resize(numbers_from_file.size() / 2);
parallel_for(static_cast<std::size_t>(0), numbers_from_file_.size(), static_cast<std::size_t>(2), [&](std::size_t i) {
    results_[i / 2] = numbers_from_file_[i] * numbers_from_file_[i + 1]);
});

Это просто быстро, конечно, никаких гарантий, но его можно заменить напрямую.

0 голосов
/ 30 июня 2011

Ваш код идентичен

for (unsigned j = 0; j < numbers_from_file_.size()/2; ++j)
{
    results_.push_back( numbers_from_file_[2*j] * numbers_from_file_[2*j + 1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...