splincodewd
@splincodewd
Developer

Как на C++ выполнить параллельные математические вычисления?

У меня есть числа от 1 до 18446744073709551615. И для каждого числа вычисляется остаток от деления. Но вычисления получаются бесконечными, мне сказали, что нужно делать в несколько потоков и тогда будет все параллельно, но я не понимаю как это.

Получение простого числа 100%. Первые 500 простых чисел по таблице прогонял, ответ тоже 100%. Исходя из готовых алгоритмов (так как вероятностные использовать нельзя).

#include <iostream>
#include <biginteger.cpp>
using namespace std;

int main(int argc, char *argv[]) {
    char *text = "274876858367";
    BigInteger n(text), k, q;

    if (n % 2 == 0 || n == 1) {
        cout << "число не является простым" << endl;
        return 0;
    }

    q = n.sqrt() + 1;

    BigInteger m;
    bool prm = true;

    // простые делители
    // начинаются с тройки

    for(k = 3; k <= q; ) {

        // все четные делители и все делители,
        // кратные простым числам, могут быть опущены
        if ((k % 2 == 0) || (k % 3 == 0)) { k++; continue; }

        //m = n%k;
        //cout << "n = " << n << " k = " << k << ", n % k = " << m <<endl;

        if (n % k == 0) {
            prm = false;
            break;
        }

        k++;
    }

    if (prm) cout << "число является простым" << endl;
    else cout << "число не является простым" << endl;

    return 0;
}


Можете привести примеры, пожалуйста?
  • Вопрос задан
  • 3697 просмотров
Решения вопроса 2
OpenMP
#include <iostream>

int main(int argc, char* argv[]) {

	#pragma omp parallel for
	for (size_t i = 0; i < 1000000; ++i)
	{
		std::cout << i << std::endl;
	}
}


Конкретно этот пример работает медленнее на нескольких потоках из-за синхронизации ввода-вывода. Для эффективного использования результат нужно накапливать в памяти, затем выводить.
Ответ написан
@Alexander1705
Способов распаралелить много, но хочу заметить, что ваши вычисления получаются бесконечными отчасти благодаря следующей строке:
cout << sqrt(n) << endl;
А именно, из-за endl. После каждого вычисления вы зачем-то сбрасываете поток вместо того, чтоб просто вывести символ перевода на новую строку '\n'.

P.S. В С пишите math.h, а в C++ - cmath. И зачем вы используете while вместо for?
#include <cstdint>
...
for (uint64_t i = 0; i < UINT64_MAX; ++i)


P.P.S. Вот пример на чистом C++. Не забудьте подключить библиотеку pthread.
Код
#include <iostream>
#include <sstream>
#include <string>
#include <thread>
#include <mutex>
#include <chrono>
#include <cmath>
#include <cstdint>


using namespace std;


mutex ios_mutex;


void compute(int b, int e)
{
    stringstream buffer;
    for (uint64_t i = b; i < e; ++i)
    {
        buffer << sqrt(i) << '\n';
    }

    ios_mutex.lock();
    cout << buffer.str();
    ios_mutex.unlock();
}


int main(int argc, char** argv)
{
    thread t0(compute,   0,  99);
    thread t1(compute, 100, 199);
    thread t2(compute, 200, 299);
    thread t3(compute, 300, 399);
    thread t4(compute, 400, 499);
    thread t5(compute, 500, 599);
    thread t6(compute, 600, 699);
    thread t7(compute, 700, 799);

    t0.join();
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();
    t6.join();
    t7.join();

    return 0;
}

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы