1- Как скачать Visual Studio бесплатно
1- How to download Visual studio for free
1- Как скачать Visual Studio бесплатно
1- How to download Visual studio for free
3- программа для расчета площади круга
3- program for calculate the area of the circle
4-программа для вычисления pi
4- program for calculate pi
5- Найдите максимальное значение индекса в массиве
5- Find the index maximum value in array
6-Умножение матриц
6-Matrix multiplication
7- онлайн-компилятор для C++ и всех языков программирования
7- online compiler for C++ and all programming languages
8- (Привет, мир) используя параллель
8- (Hello world) using parallel
9- Программа «Перечисление нитей»
9- Thread Listing Program
10- Общие и частные переменные в OpenMP
10- Public and Private Variables in OpenMP
11- Параметр reduction в OpenMP
11- Reduction parameter in OpenMP
#include <iostream>
#include <fstream>
#include <random>
#include <thread> // Библиотека для работы с многопоточностью
using namespace std;
// Функция для генерации случайного целого числа в диапазоне [min, max]
int randomInt(int min, int max) {
static random_device rd; // Генератор случайных чисел
static mt19937 gen(rd()); // Инициализация генератора случайных чисел
uniform_int_distribution<> dis(min, max); // Равномерное распределение случайных чисел в заданном диапазоне
return dis(gen); // Возвращает случайное число в заданном диапазоне
}
// Функция для вычисления части произведения матриц
void matrixMultiplication(double** A, double** B, double** C, int start, int end, int n) {
for (int i = start; i < end; ++i) { // Проход по строкам части матрицы C
for (int j = 0; j < n; ++j) { // Проход по столбцам матрицы C
C[i][j] = 0; // Инициализация элемента матрицы C нулём
for (int k = 0; k < n; ++k) { // Проход по столбцам матрицы A и строкам матрицы B
C[i][j] += A[i][k] * B[k][j]; // Вычисление элемента матрицы C как суммы произведений соответствующих элементов матриц A и B
}
}
}
}
int main() {
int n;
cout << "Enter the dimensionality of the matrix: ";
cin >> n;
// Выделение памяти для матриц и генерация случайных элементов
double** A = new double* [n];
double** B = new double* [n];
double** C = new double* [n];
for (int i = 0; i < n; ++i) {
A[i] = new double[n];
B[i] = new double[n];
C[i] = new double[n];
for (int j = 0; j < n; ++j) {
A[i][j] = randomInt(1, 10); // Генерация случайного элемента матрицы A
B[i][j] = randomInt(1, 10); // Генерация случайного элемента матрицы B
}
}
// Вычисление произведения матриц параллельно с использованием нескольких потоков
int num_threads = thread::hardware_concurrency(); // Получаем количество ядер процессора
vector<thread> threads;
int chunk_size = n / num_threads;
int start = 0;
int end = chunk_size;
for (int i = 0; i < num_threads; ++i) {
if (i == num_threads - 1) end = n; // Последний поток обрабатывает оставшуюся часть
threads.emplace_back(matrixMultiplication, A, B, C, start, end, n); // Создание потока для вычисления части произведения матриц
start = end;
end += chunk_size;
}
// Ожидание завершения всех потоков
for (auto& t : threads) {
t.join(); // Присоединение потока к главному потоку
}
// Запись результатов в файл
ofstream outfile("result.txt");
if (outfile.is_open()) {
outfile << "Matrix A:\n";
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
outfile << A[i][j] << " "; // Запись элемента матрицы A в файл
}
outfile << endl;
}
outfile << "Matrix B:\n";
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
outfile << B[i][j] << " "; // Запись элемента матрицы B в файл
}
outfile << endl;
}
outfile << "Matrix C:\n";
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
outfile << C[i][j] << " "; // Запись элемента матрицы C в файл
}
outfile << endl;
}
outfile.close(); // Закрытие файла
cout << "Results have been written to result.txt" << endl;
}
else {
cout << "Unable to open file for writing." << endl;
}
// Освобождение памяти
for (int i = 0; i < n; ++i) {
delete[] A[i];
delete[] B[i];
delete[] C[i];
}
delete[] A;
delete[] B;
delete[] C;
return 0;
}
#include <iostream>
#include <omp.h>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <fstream>
// Compare and swap
void compareSwap(int* arr, int i, int j, bool ascending) {
if (ascending == (arr[i] > arr[j])) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// Bitonic merge (recursive)
void bitonicMerge(int* arr, int start, int size, bool ascending) {
if (size > 1) {
int mid = size / 2;
for (int i = start; i < start + mid; i++) {
compareSwap(arr, i, i + mid, ascending);
}
bitonicMerge(arr, start, mid, ascending);
bitonicMerge(arr, start + mid, mid, ascending);
}
}
// Sequential bitonic sort
void bitonicSortSeq(int* arr, int start, int size, bool ascending) {
if (size > 1) {
int mid = size / 2;
bitonicSortSeq(arr, start, mid, true);
bitonicSortSeq(arr, start + mid, mid, false);
bitonicMerge(arr, start, size, ascending);
}
}
// Parallel bitonic sort using OpenMP
void bitonicSortParallel(int* arr, int n, bool ascending) {
for (int size = 2; size <= n; size <<= 1) {
for (int step = size >> 1; step > 0; step >>= 1) {
#pragma omp parallel for
for (int i = 0; i < n; i += size) {
for (int j = i; j < i + step; j++) {
compareSwap(arr, j, j + step, ascending == ((j & size) == 0));
}
}
}
}
}
int main() {
// Exponents we need to test
std::vector<int> exponents = {10, 20, 25};
// Open CSV output (can be imported into Excel)
std::ofstream csv("results.csv");
csv << "N,Threads,TimeSeconds,Speedup\n";
for (int p : exponents) {
int n = 1 << p;
// Allocate arrays
int* arrSeq = new int[n];
int* arrPar = new int[n];
// Seed random with current time
srand(static_cast<unsigned>(time(nullptr)));
// Fill arrays with random numbers
for (int i = 0; i < n; i++) {
arrSeq[i] = rand() % 10000;
arrPar[i] = arrSeq[i];
}
// Time sequential
double startSeq = omp_get_wtime();
bitonicSortSeq(arrSeq, 0, n, true);
double endSeq = omp_get_wtime();
double seqTime = endSeq - startSeq;
// Write the sequential row (treat "Threads=1" as sequential reference)
// Speedup = 1.0 by definition
csv << p << "," << 1 << "," << seqTime << "," << 1.0 << "\n";
// Now test parallel from 1..8 threads
// We reuse seqTime as the baseline for speedup
for (int t = 1; t <= 8; t++) {
// Reload original data for parallel
for (int i = 0; i < n; i++) {
arrPar[i] = rand() % 10000;
}
omp_set_num_threads(t);
double startPar = omp_get_wtime();
bitonicSortParallel(arrPar, n, true);
double endPar = omp_get_wtime();
double parTime = endPar - startPar;
double speedup = seqTime / parTime;
csv << p << "," << t << "," << parTime << "," << speedup << "\n";
}
delete[] arrSeq;
delete[] arrPar;
}
csv.close();
std::cout << "Done. Open results.csv in Excel to see times and speedups.\n";
return 0;
}