/* * Дана последовательность натуральных чисел a0, ... * Создать многопоточное приложение для поиска суммы квадратов sum(a[i]^2. * В приложении вычисления должны независимо выполнять четыре потока. */ #include #include #include #include #include const unsigned int arrSize = 10000000; //const unsigned int arrSize = 500000000; //const unsigned int arrSize = 900000000; double *A ; //последовательность чисел a0... //const int threadNumber = 1; // Количество потоков //const int threadNumber = 2; // Количество потоков const int threadNumber = 4; // Количество потоков //const int threadNumber = 8; // Количество потоков //стартовая функция для дочерних потоков //void sqsum(int iTread, int iTN, double *arr, int size, double *sum) { void sqsum(int iTread, int iTN, double *arr, int size, double &sum) { for(int i = iTread; i < size; i+=iTN) { //*sum += arr[i] * arr[i]; sum += arr[i] * arr[i]; } } int main() { // заполнение массива A A = new double[arrSize]; if(A == nullptr) { std::cout << "Incorrect size of vector = " << arrSize << "\n"; return 1; } for(int i = 0; i < arrSize; ++i) { A[i] = double(i); } std::thread *thr[threadNumber]; double sum[threadNumber]; clock_t start_time = clock(); // начальное время // Создание потоков for (int i=0 ; ijoin(); rez += sum[i]; delete thr[i]; } clock_t end_time = clock(); // конечное время //вывод результата std::cout << "Сумма квадратов = " << rez << "\n" ; std::cout << "Сумма квадратов = " << std::setprecision(20) << rez << "\n" ; std::cout << "Сумма квадратов = " << std::scientific << std::setprecision(std::numeric_limits::digits10 + 1) << rez << "\n" ; std::cout << "Время счета и сборки = " << end_time - start_time << "\n"; delete[] A; return 0; }