#c #parallel-processing #openmp
#c #параллельная обработка #openmp
Вопрос:
У меня есть код, который я написал с использованием OpenMP и C , и я хочу знать, какая часть из него последовательная и параллельная. Я читал о некоторых законах и формулах коэффициента ускорения, но я не знаю, как рассчитать процентное соотношение параллельного кода и последовательного кода
и если кто-нибудь мог бы указать мне какое-нибудь бесплатное программное обеспечение и веб-сайт, которые помогли бы мне рассчитать коэффициент ускорения для ядер 1-8
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <omp.h>
using namespace std;
int userInput(int num) {
const int len = num;
return len;
}
void main() {
long double dataSetOneSum = 0, dataSetTwoSum = 0, multiplicationSum = 0, setOnePowSum = 0, setTwoPowSum = 0;
long double correlationCoefficient;
int i;
int num;
cout << "enter size of data sets: " << endl;
cin >> num;
int length = userInput(num);
double wtime;
long double* dataSetOne = new long double[length];
long double* dataSetTwo = new long double[length];
long double* dataSetMultiplication = new long double[length];
long double* dataSetOnePow = new long double[length];
long double* dataSetTwoPow = new long double[length];
srand(time(0));
omp_set_num_threads(3);
wtime = omp_get_wtime();
#pragma omp parallel for
for (i = 0; i < length; i ) {
dataSetOne[i] = 1 (rand() % 99);
cout << "thread num: " << omp_get_thread_num() << endl;
}
#pragma omp parallel for
for (i = 0; i < length; i ) {
dataSetOneSum = dataSetOneSum dataSetOne[i];
//cout << "thread num: " << omp_get_thread_num() << endl;
}
cout << "the sum of the first data set :" << fixed << dataSetOneSum << endl;
#pragma omp parallel for
for (i = 0; i < length; i ) {
dataSetTwo[i] = 1 (rand() % 99);
//cout << "thread num: " << omp_get_thread_num() << endl;
}
#pragma omp parallel for
for (i = 0; i < length; i ) {
dataSetTwoSum = dataSetTwoSum dataSetTwo[i];
//cout << "thread num: " << omp_get_thread_num() << endl;
}
cout << "the sum of the second data set :" << dataSetTwoSum << endl;;
#pragma omp parallel for
for (i = 0;i < length;i ) {
dataSetMultiplication[i] = dataSetOne[i] * dataSetTwo[i];
multiplicationSum = multiplicationSum dataSetMultiplication[i];
//cout << "thread num: " << omp_get_thread_num() << endl;
}
cout << "the sum of the two data sets multiplied : " << multiplicationSum << endl;
#pragma omp parallel for
for (i = 0;i < length;i ) {
dataSetOnePow[i] = pow(dataSetOne[i], 2);
setOnePowSum = setOnePowSum dataSetOnePow[i];
//cout << "thread num: " << omp_get_thread_num() << endl;
}
cout << "the sum of the first data set numbers raised to the power of 2 : " << setOnePowSum << endl;
#pragma omp parallel for
for (i = 0;i < length;i ) {
dataSetTwoPow[i] = pow(dataSetTwo[i], 2);
setTwoPowSum = setTwoPowSum dataSetTwoPow[i];
//cout << "thread num: " << omp_get_thread_num() << endl;
}
cout << "the sum of the second data set numbers raised to the power of 2 : " << setTwoPowSum << endl;
correlationCoefficient = ((length * multiplicationSum) - (dataSetOneSum * dataSetTwoSum)) / (sqrt((length * setOnePowSum) - (pow(dataSetOneSum, 2))) * sqrt((length * setTwoPowSum) - (pow(dataSetTwoSum, 2))));
cout << "the correlation = " << correlationCoefficient << endl;
if (correlationCoefficient > 0) {
cout << "the correlation between data sets is: " << correlationCoefficient << ", data sets is positively correlated " << endl;
}
else if (correlationCoefficient == 0) {
cout << "the correlation between datasets is: " << correlationCoefficient << ", data sets is independent" << endl;
}
else if (correlationCoefficient < 0) {
cout << "the correlation between data sets is: " << correlationCoefficient << ", data sets is negatively correlated " << endl;
}
wtime = omp_get_wtime() - wtime;
cout << " Elapsed wall clock time = " << wtime << "n";
system("pause");
}
Комментарии:
1. Если вас волнует скорость, используйте
x*x
неpow(x, 2)
2. @BenVoigt что ж, спасибо, но сейчас довольно сложно редактировать код, поскольку я должен отправить его как проект, и я не хочу больше ошибок, я просто хочу увеличить коэффициент ускорения
3. Если вы перейдете
omp_set_num_threads(3);
от жестко запрограммированного к входному (я думаю, если вы оставите это, он автоматически используетOMP_NUM_THREADS
переменную среды?), Затем измерьте время выполнения с различным количеством ядер, у вас будут данные, которые вы должны отобразить в виде графика. Из этого графика вы должны быть в состоянии оценить последовательные и параллельные доли.4. @BenVoigt на самом деле это было для тестирования, в конце я мог бы изменить эту строку кода
5. Пожалуйста, обратите внимание, что ваш код полон условий гонки.