Add OpenMP task
This commit is contained in:
parent
b75c499ff4
commit
346de6a088
@ -28,4 +28,5 @@ add_subdirectory(third-party/fmt)
|
||||
add_subdirectory(task1)
|
||||
add_subdirectory(task2)
|
||||
add_subdirectory(task3)
|
||||
add_subdirectory(task4)
|
||||
add_subdirectory(task4)
|
||||
add_subdirectory(task5)
|
22
task5/CMakeLists.txt
Normal file
22
task5/CMakeLists.txt
Normal file
@ -0,0 +1,22 @@
|
||||
find_package(Qt6 COMPONENTS Core REQUIRED)
|
||||
find_package(OpenMP)
|
||||
|
||||
if (OPENMP_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
|
||||
endif ()
|
||||
|
||||
add_executable(task5-chpt4ex4)
|
||||
|
||||
target_include_directories(task5-chpt4ex4 PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
|
||||
target_sources(task5-chpt4ex4 PRIVATE
|
||||
src/main.cpp
|
||||
)
|
||||
|
||||
|
||||
target_link_libraries(task4-monitor PRIVATE
|
||||
Qt6::Core
|
||||
OpenMP::OpenMP_CXX)
|
51
task5/src/main.cpp
Normal file
51
task5/src/main.cpp
Normal file
@ -0,0 +1,51 @@
|
||||
#include <cmath>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <numbers>
|
||||
|
||||
#include <omp.h>
|
||||
|
||||
class MidsumException : std::exception {
|
||||
const char *what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW override {
|
||||
return "Invalid call to midsum function";
|
||||
}
|
||||
};
|
||||
|
||||
auto midsum(std::function<double(double)> fun, double x1, double x2) -> double {
|
||||
if (x2 <= x1) {
|
||||
throw MidsumException();
|
||||
}
|
||||
auto dx = x2 - x1;
|
||||
return fun((x1 + (dx / 2))) * dx;
|
||||
}
|
||||
|
||||
auto csin(double arg) -> double {
|
||||
return std::sin(arg) + 1;
|
||||
}
|
||||
|
||||
auto main(int argc, char **argv) -> int {
|
||||
double midsum_val;
|
||||
double from = 0;
|
||||
double to = 2 * std::numbers::pi;
|
||||
int slices = 20;
|
||||
double step = 1.0 * (to - from) / slices;
|
||||
|
||||
std::cout << "Num slices: " << slices << " Step size: " << step << std::endl;
|
||||
|
||||
#pragma omp parallel
|
||||
{
|
||||
#pragma omp for
|
||||
|
||||
for (int i = 0; i < slices; i++) {
|
||||
std::cout << "Calculating step: " << i << " from " << i * step << " to " << (i + 1) * step << std::endl;
|
||||
midsum_val += midsum(csin, (i * step), ((i + 1) * step));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::cout << midsum_val <<
|
||||
std::endl;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user