...
 
Commits (5)
...@@ -7,15 +7,24 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE) ...@@ -7,15 +7,24 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
find_package(OpenMP) find_package(OpenMP)
add_executable(dynamicsystems main.cpp compute.cpp) add_executable(dynamicsystems main.cpp compute.cpp)
if(OPENMP_FOUND) if(OPENMP_FOUND)
#target_compile_options(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS}) target_compile_options(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_link_libraries(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS})
endif()
endif() endif()
find_package(Boost REQUIRED) find_package(Boost REQUIRED COMPONENTS program_options)
target_include_directories(dynamicsystems PRIVATE ${Boost_INCLUDE_DIR}) target_include_directories(dynamicsystems PRIVATE ${Boost_INCLUDE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_program_options") target_link_libraries(dynamicsystems PRIVATE ${Boost_LIBRARIES})
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
target_compile_options(dynamicsystems PRIVATE "-std=c++11" "-qopt-report=5" "-qopt-report-phase=vec" "-xhost") if (WIN32)
target_compile_options(dynamicsystems PRIVATE "/Qopt-report:5"
"/Qopt-report-phase:vec"
"/QxHost")
else(WIN32)
target_compile_options(dynamicsystems PRIVATE "-qopt-report=5"
"-qopt-report-phase=vec"
"-xhost")
endif(WIN32)
endif() endif()
#include "compute.hpp" #include "compute.hpp"
#include <algorithm>
float compute(float alpha, float beta, aligned_vector<float> seed_x, float compute(float alpha, float beta, aligned_vector<float> seed_x,
aligned_vector<float> seed_y, int num_iterations, float threshold) { aligned_vector<float> seed_y, int num_iterations,
float threshold) {
int num_seeds = seed_x.size(); int num_seeds = seed_x.size();
assert(seed_y.size() == num_seeds); assert(seed_y.size() == num_seeds);
...@@ -13,7 +16,7 @@ float compute(float alpha, float beta, aligned_vector<float> seed_x, ...@@ -13,7 +16,7 @@ float compute(float alpha, float beta, aligned_vector<float> seed_x,
float d = 0.0; float d = 0.0;
for (int i = 0; i < num_iterations && d < threshold ; i++) { for (int i = 0; i < num_iterations && d < threshold; i++) {
#pragma omp simd aligned(xp, yp : 64) #pragma omp simd aligned(xp, yp : 64)
for (int s = 0; s < num_seeds; s++) { for (int s = 0; s < num_seeds; s++) {
yp[s] = yp[s] + beta * std::sin(TWO_PI * xp[s]); yp[s] = yp[s] + beta * std::sin(TWO_PI * xp[s]);
......
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
#include "colormaps.hpp" #include "colormaps.hpp"
#include "compute.hpp" #include "compute.hpp"
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// get arguments from CLI // get arguments from CLI
// these can be input by user // these can be input by user
...@@ -32,6 +30,27 @@ int main(int argc, char* argv[]) { ...@@ -32,6 +30,27 @@ int main(int argc, char* argv[]) {
namespace po = boost::program_options; namespace po = boost::program_options;
try { try {
po::options_description desc("Options"); po::options_description desc("Options");
<<<<<<< HEAD
desc.add_options()("help", "Help message")(
"iterations,n", po::value<int>(&num_iterations)->default_value(100),
" Number of iterations")(
"threshold,s", po::value<float>(&threshold)->default_value(1),
" Threshold above that computation is stopped")(
"amin,a", po::value<float>(&alphamin)->default_value(0),
" α lower bound")("amax,A",
po::value<float>(&alphamax)->default_value(1),
" α upper bound")(
"alphas,w", po::value<int>(&alpha_num_intervals)->default_value(100),
" α resolution/width of image")(
"betas,h", po::value<int>(&beta_num_intervals)->default_value(100),
" β resolution/height of image")(
"bmin,b", po::value<float>(&betamin)->default_value(0),
" β lower bound")("bmax,B",
po::value<float>(&betamax)->default_value(1),
" β upper bound")(
"seedpoints,S", po::value<int>(&num_seedpoints)->default_value(10),
" Number of seedpoints (uniformly distributed in (0,1) )");
=======
desc.add_options() desc.add_options()
("help", "Help message") ("help", "Help message")
("iterations,n", po::value<int>(&num_iterations)->default_value(100), " Number of iterations") ("iterations,n", po::value<int>(&num_iterations)->default_value(100), " Number of iterations")
...@@ -45,6 +64,7 @@ int main(int argc, char* argv[]) { ...@@ -45,6 +64,7 @@ int main(int argc, char* argv[]) {
("seedpoints,S", po::value<int>(&num_seedpoints)->default_value(10), " Number of seedpoints (uniformly distributed in (0,1) )") ("seedpoints,S", po::value<int>(&num_seedpoints)->default_value(10), " Number of seedpoints (uniformly distributed in (0,1) )")
("output,O", po::value<bool>(&output)->default_value(true), " Boolean flag for output") ("output,O", po::value<bool>(&output)->default_value(true), " Boolean flag for output")
; ;
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
po::variables_map vm; po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm); po::store(po::parse_command_line(argc, argv, desc), vm);
...@@ -57,11 +77,12 @@ int main(int argc, char* argv[]) { ...@@ -57,11 +77,12 @@ int main(int argc, char* argv[]) {
po::notify(vm); po::notify(vm);
// check if our integers are >0, else throw invalid-argument-error // check if our integers are >0, else throw invalid-argument-error
if ( (num_iterations < 1) || (alpha_num_intervals < 1) || (beta_num_intervals <1) ) { if ((num_iterations < 1) || (alpha_num_intervals < 1) ||
(beta_num_intervals < 1)) {
throw po::validation_error(po::validation_error::invalid_option_value); throw po::validation_error(po::validation_error::invalid_option_value);
} }
} catch (po::error &e) { } catch (po::error& e) {
std::cerr << e.what() << std::endl; std::cerr << e.what() << std::endl;
return -1; return -1;
} }
...@@ -86,12 +107,22 @@ int main(int argc, char* argv[]) { ...@@ -86,12 +107,22 @@ int main(int argc, char* argv[]) {
betasp[i] = betamin + i * beta_interval_size; betasp[i] = betamin + i * beta_interval_size;
} }
<<<<<<< HEAD
// aligned_vector<float> x_start = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,
// 0.9};
aligned_vector<float> x_start(num_seedpoints);
aligned_vector<float> y_start(num_seedpoints);
for (int i = 1; i < num_seedpoints + 1; ++i) {
x_start[i - 1] = i / (num_seedpoints + 1);
y_start[i - 1] = 0;
=======
//aligned_vector<float> x_start = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9}; //aligned_vector<float> x_start = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
aligned_vector<float> x_start(num_seedpoints); aligned_vector<float> x_start(num_seedpoints);
aligned_vector<float> y_start(num_seedpoints); aligned_vector<float> y_start(num_seedpoints);
for (int i = 1; i < num_seedpoints + 1; ++i){ for (int i = 1; i < num_seedpoints + 1; ++i){
x_start[i-1] = (float)i / (num_seedpoints + 1); x_start[i-1] = (float)i / (num_seedpoints + 1);
y_start[i-1] = 0; y_start[i-1] = 0;
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
} }
// // aligned_vector<float> y_start = {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}; // // aligned_vector<float> y_start = {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9};
//aligned_vector<float> y_start = {0, 0, 0, 0, 0, 0, 0, 0, 0}; //aligned_vector<float> y_start = {0, 0, 0, 0, 0, 0, 0, 0, 0};
...@@ -105,8 +136,8 @@ int main(int argc, char* argv[]) { ...@@ -105,8 +136,8 @@ int main(int argc, char* argv[]) {
#pragma omp parallel for schedule(dynamic) #pragma omp parallel for schedule(dynamic)
for (int a = 0; a < alpha_num_params; a++) { for (int a = 0; a < alpha_num_params; a++) {
for (int b = beta_num_params - 1; b >= 0; b--) { for (int b = beta_num_params - 1; b >= 0; b--) {
result[(beta_num_params - b - 1) * alpha_num_params + a] = result[(beta_num_params - b - 1) * alpha_num_params + a] = compute(
compute(alphas[a], betas[b], x_start, y_start, num_iterations, threshold); alphas[a], betas[b], x_start, y_start, num_iterations, threshold);
} }
} }
auto time_end = std::chrono::system_clock::now(); auto time_end = std::chrono::system_clock::now();
...@@ -114,6 +145,17 @@ int main(int argc, char* argv[]) { ...@@ -114,6 +145,17 @@ int main(int argc, char* argv[]) {
std::chrono::duration<float>(time_end - time_start).count(); std::chrono::duration<float>(time_end - time_start).count();
std::cout << "TIME: " << elapsed_seconds << std::endl; std::cout << "TIME: " << elapsed_seconds << std::endl;
<<<<<<< HEAD
// Output result into .csv
std::string file_result = "result.csv";
std::ofstream ostrm_csv(file_result);
ostrm_csv << "alpha beta value\n";
for (int a = 0; a < alpha_num_params; a++) {
for (int b = beta_num_params - 1; b >= 0; b--) {
ostrm_csv << alphas[a] << ' ' << betas[b] << ' '
<< result[(beta_num_params - b - 1) * alpha_num_params + a]
<< std::endl;
=======
if(output){ if(output){
// Output result into .csv // Output result into .csv
...@@ -124,8 +166,30 @@ int main(int argc, char* argv[]) { ...@@ -124,8 +166,30 @@ int main(int argc, char* argv[]) {
for (int b = beta_num_params - 1; b >= 0; b--) { for (int b = beta_num_params - 1; b >= 0; b--) {
ostrm_csv << alphas[a] << ' ' << betas[b] << ' ' << result[(beta_num_params - b - 1) * alpha_num_params + a] << std::endl; ostrm_csv << alphas[a] << ' ' << betas[b] << ' ' << result[(beta_num_params - b - 1) * alpha_num_params + a] << std::endl;
} }
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
} }
<<<<<<< HEAD
// transform floats into grayscale-colors:
for (int i = 0; i < alpha_num_params * beta_num_params; ++i) {
if (result[i] > threshold) {
colors[i] = 255;
colors_rgb[3 * i] = 255;
colors_rgb[3 * i + 1] = 255;
colors_rgb[3 * i + 2] = 255;
} else {
colors[i] = (int)254 * result[i] / threshold;
// RGB color gradient: viridis from matplotlib
int idx = floor(255 * result[i] / threshold);
int r = floor(255 * viridis[idx][0]);
int g = floor(255 * viridis[idx][1]);
int b = floor(255 * viridis[idx][2]);
colors_rgb[3 * i] = r; // red
colors_rgb[3 * i + 1] = g; // green
colors_rgb[3 * i + 2] = b; // blue
=======
// transform floats into grayscale-colors: // transform floats into grayscale-colors:
for (int i = 0; i < alpha_num_params*beta_num_params; ++i) { for (int i = 0; i < alpha_num_params*beta_num_params; ++i) {
if (result[i] > threshold) { if (result[i] > threshold) {
...@@ -146,8 +210,32 @@ int main(int argc, char* argv[]) { ...@@ -146,8 +210,32 @@ int main(int argc, char* argv[]) {
colors_rgb[3*i+1] = g;// green colors_rgb[3*i+1] = g;// green
colors_rgb[3*i+2] = b; // blue colors_rgb[3*i+2] = b; // blue
} }
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
} }
<<<<<<< HEAD
// Output pixel vector into PGM File
std::string filename = "picture.pgm";
std::ofstream ostrm(filename);
ostrm << "P5" << '\n';
ostrm << alpha_num_params << ' ' << beta_num_params << '\n';
ostrm << 255 << '\n'; // max. gray value
// 1 byte per pixel
for (int i = 0; i < colors.size(); ++i) {
ostrm.write(reinterpret_cast<char*>(&colors[i]), 1); // colors.size());
}
// Output pixel vector into PPM File
std::string filename_rgb = "picture_rgb.ppm";
std::ofstream ostrm_rgb(filename_rgb);
ostrm_rgb << "P6" << '\n';
ostrm_rgb << alpha_num_params << ' ' << beta_num_params << '\n';
ostrm_rgb << 255 << '\n'; // max. gray value
// 3 byte per pixel
for (int i = 0; i < colors_rgb.size(); ++i) {
// das geht theoretisch auch mit dem ganzen Array, aber praktisch nicht?!
ostrm_rgb.write(reinterpret_cast<char*>(&colors_rgb[i]),
1); // colors_rgb.size());
=======
// Output pixel vector into PGM File // Output pixel vector into PGM File
std::string filename = "picture.pgm"; std::string filename = "picture.pgm";
std::ofstream ostrm(filename); std::ofstream ostrm(filename);
...@@ -169,5 +257,6 @@ int main(int argc, char* argv[]) { ...@@ -169,5 +257,6 @@ int main(int argc, char* argv[]) {
// das geht theoretisch auch mit dem ganzen Array, aber praktisch nicht?! // das geht theoretisch auch mit dem ganzen Array, aber praktisch nicht?!
ostrm_rgb.write(reinterpret_cast<char*>(&colors_rgb[i]),1);//colors_rgb.size()); ostrm_rgb.write(reinterpret_cast<char*>(&colors_rgb[i]),1);//colors_rgb.size());
} }
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
} }
} }