Как добавить цикл OpenMP for, заменив цикл while последовательного кода - PullRequest
0 голосов
/ 25 октября 2018

следующий код написан последовательно.Я хочу реализовать OpenMP, заменив цикл while на цикл for, но понятия не имею, как это сделать.Я знаю синтаксис OpenMP, но не могу его реализовать.

Причиной параллелизма является проверка производительности между последовательной и параллельной техникой.Любая помощь?

  void block::mine_block(uint32_t difficulty) noexcept
{
    string str(difficulty, '0');

    auto start = system_clock::now();

    while (_hash.substr(0, difficulty) != str)
    {
        ++_nonce;
        _hash = calculate_hash();
    }

    auto end = system_clock::now();
    duration<double> diff = end - start;

    cout << "Block mined: " << _hash << " in " << diff.count() << " seconds" << endl;
}

@ Matthieu Brucher - Может ли это быть решением?

#pragma omp parallel    // start the parallel region
{
    #pragma omp single  // let the while loop execute by one thread and generate tasks
    while (time < TotalTime){

        #pragma omp task
        {
            // this code will be a task that may be executed immediately on a different core or deferred for later execution
        }

    } // end of while loop and single region
    // at this point we also wait until all tasks that were created have finished

} // end of parallel region

Путем реализации вышеуказанногокод

#pragma omp parallel                        
    {
        #pragma omp single                      
        while (_hash.substr(0, difficulty) != str) {
            #pragma omp task                    
            {
                ++_nonce;
                _hash = calculate_hash();
            }
        }
    }

1 Ответ

0 голосов
/ 25 октября 2018

Проблема в том, что у вас есть зависимость в вашем цикле.Таким образом, невозможно распараллелить его как есть.

Хороший первый подход - использовать несколько начальных точек и несколько потоков, которые будут создавать новые хэши.Затем, когда один из потоков находит хорошее совпадение, вы устанавливаете глобальный флаг bool и останавливаете все потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...