From baef74904d3a65b0866e51d5d414e1caffa19505 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 3 Mar 2019 10:54:29 +0100 Subject: [PATCH 01/98] cmake: Move options to own file Signed-off-by: Andreas Schneider --- CMakeLists.txt | 47 ++------------------------------------------- DefineOptions.cmake | 44 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 DefineOptions.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b9096ee6dd4..dfce6f1ab137 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,8 @@ IF(DEFINED DT_FORCE_CXX_COMPILER) set(CMAKE_CXX_COMPILER ${DT_FORCE_CXX_COMPILER}) endif() +include(DefineOptions.cmake) + include(CheckCCompilerFlag) include(TestBigEndian) @@ -50,45 +52,6 @@ endif() include(GNUInstallDirs) -option(USE_CAMERA_SUPPORT "Detect and use camera support if available." ON) -option(USE_NLS "Build Native Language Support (using gettext)" ON) -option(USE_COLORD "Enable colord support" ON) -option(USE_MAP "Build Map View parts" ON) -option(USE_LUA "Build lua scripting support" ON) -option(DONT_USE_INTERNAL_LUA "Never fall back to the intree copy of lua" ON) -option(USE_FLICKR "Enable Flickr support" ON) -option(USE_KWALLET "Build kwallet password storage back-end" ON) -option(USE_LIBSECRET "Build libsecret password storage back-end" ON) -option(USE_UNITY "Use libunity to report progress in the launcher" OFF) -option(USE_OPENMP "Use openmp threading support." ON) -option(USE_OPENCL "Use OpenCL support." ON) -option(USE_GRAPHICSMAGICK "Use GraphicsMagick library for image import." ON) -option(USE_DARKTABLE_PROFILING OFF) -option(CUSTOM_CFLAGS "Don't override compiler optimization flags." OFF) -option(BUILD_USERMANUAL "Build all the versions of the usermanual." OFF) -option(BINARY_PACKAGE_BUILD "Sets march optimization to generic" OFF) -option(USE_XMLLINT "Run xmllint to test if darktableconfig.xml is valid" ON) -option(USE_OPENJPEG "Enable JPEG 2000 support" ON) -option(USE_WEBP "Enable WebP export support" ON) -option(BUILD_CMSTEST "Build a test program to check your system's color management setup" ON) -option(USE_OPENEXR "Enable OpenEXR support" ON) -option(BUILD_PRINT "Build the print module" ON) -option(BUILD_RS_IDENTIFY "Build the darktable-rs-identify debug aid" ON) -option(BUILD_SSE2_CODEPATHS "(EXPERIMENTAL OPTION, DO NOT DISABLE) Building SSE2-optimized codepaths" ON) -option(VALIDATE_APPDATA_FILE "Use appstream-util (if found) to validate the .appdata file" OFF) -option(BUILD_TESTS "Build tests in src/tests/, runnable from the build/ directory" OFF) -option(BUILD_BATTERY_INDICATOR "Add an icon to the top toolbar showing the state of a laptop battery" OFF) -option(BUILD_MSYS2_INSTALL "Build an MSYS2 version of the install, aka for Windows platform, but without dependency installs" OFF) -option(BUILD_NOISE_TOOLS "Build tools for generating noise proifles" OFF) -option(BUILD_CURVE_TOOLS "Build tools for generating base and tone curves" OFF) -option(USE_LENSFUN "Enable LensFun support" ON) - -if(USE_OPENCL) - option(TESTBUILD_OPENCL_PROGRAMS "Test-compile opencl programs (needs llvm and clang 3.9+)" ON) -else() - set(TESTBUILD_OPENCL_PROGRAMS OFF) -endif() - if(BUILD_SSE2_CODEPATHS) CHECK_C_COMPILER_FLAG("-msse2" _MSSE2) if(NOT _MSSE2) @@ -124,12 +87,6 @@ MESSAGE(STATUS "Is the target platform supported: ${IS_SUPPORTED_PLATFORM}") set(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES_OLD}") unset(CMAKE_REQUIRED_INCLUDES_OLD) -if(APPLE) - option(USE_MAC_INTEGRATION "Enable OS X integration" ON) -else(APPLE) - set(USE_MAC_INTEGRATION OFF) -endif(APPLE) - # When cross compiling, CMAKE_INSTALL_PREFIX will point to something like "/opt/darktable", but that's not useful when using the path to load # modules on runtime. Then we need something like "C:\Program Files\darktable". Doesn't need to be set when doing regular compiles. if(NOT DEFINED RUNTIME_INSTALL_PREFIX) diff --git a/DefineOptions.cmake b/DefineOptions.cmake new file mode 100644 index 000000000000..b49c21b9f3b4 --- /dev/null +++ b/DefineOptions.cmake @@ -0,0 +1,44 @@ +option(USE_CAMERA_SUPPORT "Detect and use camera support if available." ON) +option(USE_NLS "Build Native Language Support (using gettext)" ON) +option(USE_COLORD "Enable colord support" ON) +option(USE_MAP "Build Map View parts" ON) +option(USE_LUA "Build lua scripting support" ON) +option(DONT_USE_INTERNAL_LUA "Never fall back to the intree copy of lua" ON) +option(USE_FLICKR "Enable Flickr support" ON) +option(USE_KWALLET "Build kwallet password storage back-end" ON) +option(USE_LIBSECRET "Build libsecret password storage back-end" ON) +option(USE_UNITY "Use libunity to report progress in the launcher" OFF) +option(USE_OPENMP "Use openmp threading support." ON) +option(USE_OPENCL "Use OpenCL support." ON) +option(USE_GRAPHICSMAGICK "Use GraphicsMagick library for image import." ON) +option(USE_DARKTABLE_PROFILING OFF) +option(CUSTOM_CFLAGS "Don't override compiler optimization flags." OFF) +option(BUILD_USERMANUAL "Build all the versions of the usermanual." OFF) +option(BINARY_PACKAGE_BUILD "Sets march optimization to generic" OFF) +option(USE_XMLLINT "Run xmllint to test if darktableconfig.xml is valid" ON) +option(USE_OPENJPEG "Enable JPEG 2000 support" ON) +option(USE_WEBP "Enable WebP export support" ON) +option(BUILD_CMSTEST "Build a test program to check your system's color management setup" ON) +option(USE_OPENEXR "Enable OpenEXR support" ON) +option(BUILD_PRINT "Build the print module" ON) +option(BUILD_RS_IDENTIFY "Build the darktable-rs-identify debug aid" ON) +option(BUILD_SSE2_CODEPATHS "(EXPERIMENTAL OPTION, DO NOT DISABLE) Building SSE2-optimized codepaths" ON) +option(VALIDATE_APPDATA_FILE "Use appstream-util (if found) to validate the .appdata file" OFF) +option(BUILD_TESTS "Build tests in src/tests/, runnable from the build/ directory" OFF) +option(BUILD_BATTERY_INDICATOR "Add an icon to the top toolbar showing the state of a laptop battery" OFF) +option(BUILD_MSYS2_INSTALL "Build an MSYS2 version of the install, aka for Windows platform, but without dependency installs" OFF) +option(BUILD_NOISE_TOOLS "Build tools for generating noise proifles" OFF) +option(BUILD_CURVE_TOOLS "Build tools for generating base and tone curves" OFF) +option(USE_LENSFUN "Enable LensFun support" ON) + +if (USE_OPENCL) + option(TESTBUILD_OPENCL_PROGRAMS "Test-compile opencl programs (needs llvm and clang 3.9+)" ON) +else () + set(TESTBUILD_OPENCL_PROGRAMS OFF) +endif () + +if(APPLE) + option(USE_MAC_INTEGRATION "Enable OS X integration" ON) +else(APPLE) + set(USE_MAC_INTEGRATION OFF) +endif(APPLE) From 83e12a996508b0f99b83e60809956bb6072ec124 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 10:20:52 +0200 Subject: [PATCH 02/98] cmake: Move GNUInstallDirs up Signed-off-by: Andreas Schneider --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dfce6f1ab137..81896c4d8535 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,13 @@ endif() include(DefineOptions.cmake) +# Include GNUInstallDirs, which sets sensible defaults for install directories. +# See https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html for further information. +# These values can be easily overridden if required. +# Some defaults are set for OpenBSD as well (info and man pages). + +include(GNUInstallDirs) + include(CheckCCompilerFlag) include(TestBigEndian) @@ -45,13 +52,6 @@ else() set(SOURCE_PACKAGE 0) endif() -# Include GNUInstallDirs, which sets sensible defaults for install directories. -# See https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html for further information. -# These values can be easily overridden if required. -# Some defaults are set for OpenBSD as well (info and man pages). - -include(GNUInstallDirs) - if(BUILD_SSE2_CODEPATHS) CHECK_C_COMPILER_FLAG("-msse2" _MSSE2) if(NOT _MSSE2) From 7ed5edcf9694cb6a7475c375bdf73263231aaaa7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 10:26:04 +0200 Subject: [PATCH 03/98] cmake: Check for OpenMP earlier so we can do ConfigureChecks with it As rawspeed requires OpenMP 4.0 we should require the same minimum version. Signed-off-by: Andreas Schneider --- CMakeLists.txt | 4 ++++ src/CMakeLists.txt | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 81896c4d8535..ad7322704c9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,10 @@ include(DefineOptions.cmake) include(GNUInstallDirs) +if (USE_OPENMP) + find_package(OpenMP 4.0 REQUIRED) +endif() + include(CheckCCompilerFlag) include(TestBigEndian) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 31109b3fab6c..e107f9d7e585 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -228,8 +228,6 @@ list(APPEND LIBS "${CMAKE_THREAD_LIBS_INIT}") # Need to explicitly link against math library. list(APPEND LIBS "-lm") -# Check for openmp -find_package(OpenMP) if(USE_OPENMP) if(OpenMP_C_FLAGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") From c812aa19524e2ef039e6e05bfdd8e0dc5f126957 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 17 May 2019 17:33:55 +0200 Subject: [PATCH 04/98] cmake: Fix OpenMP detection with clang Signed-off-by: Andreas Schneider --- CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad7322704c9a..6ffa35c10886 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,17 @@ include(DefineOptions.cmake) include(GNUInstallDirs) if (USE_OPENMP) + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR + CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + + # Clang has an option to specify the OpenMP standard to use. Specify it. + # FIXME: Implement this in FindOpenMP.cmake + set(OPENMP_VERSION_SPECIFIER "-fopenmp-version=40") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENMP_VERSION_SPECIFIER}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENMP_VERSION_SPECIFIER}") + endif() + find_package(OpenMP 4.0 REQUIRED) endif() From c57c70113e68915ede35fce1623836a0a665d585 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 10:45:19 +0200 Subject: [PATCH 05/98] cmake: Add configure to validate if OpenMP firstprivate can be used Signed-off-by: Andreas Schneider --- CMakeLists.txt | 2 ++ ConfigureChecks.cmake | 30 ++++++++++++++++++++++++++++++ src/config.cmake.h | 2 ++ 3 files changed, 34 insertions(+) create mode 100644 ConfigureChecks.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ffa35c10886..39a081d5cc32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,8 @@ if (USE_OPENMP) find_package(OpenMP 4.0 REQUIRED) endif() +include(ConfigureChecks.cmake) + include(CheckCCompilerFlag) include(TestBigEndian) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake new file mode 100644 index 000000000000..58d229a6181f --- /dev/null +++ b/ConfigureChecks.cmake @@ -0,0 +1,30 @@ +include(CheckCSourceCompiles) + +if (OpenMP_FOUND) + +set(CMAKE_REQUIRED_FLAGS ${OpenMP_C_FLAGS}) +set(CMAKE_REQUIRED_LIBRARIES ${OpenMP_C_LIBRARIES}) +check_c_source_compiles(" +#include + +static void sink(const int x, int a[]) +{ +#pragma omp parallel for default(none) firstprivate(x) shared(a) + for(int i = 0; i < 3; i++) { + a[i] = x + i; + } +} + +int main(void) +{ + int x = 42; + int a[3] = {0}; + + sink(x, a); + + return 0; +}" HAVE_OMP_FIRSTPRIVATE_WITH_CONST) + +set(CMAKE_REQUIRED_FLAGS) +set(CMAKE_REQUIRED_LIBRARIES) +endif() diff --git a/src/config.cmake.h b/src/config.cmake.h index 715ea485d711..bdd72c9d3ac9 100644 --- a/src/config.cmake.h +++ b/src/config.cmake.h @@ -66,6 +66,8 @@ static const char *dt_supported_extensions[] __attribute__((unused)) = {"@DT_SUP #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size)) #endif +#cmakedefine HAVE_OMP_FIRSTPRIVATE_WITH_CONST 1 + // modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh // vim: shiftwidth=2 expandtab tabstop=2 cindent // kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified; From dbff44dea069f287a9394e33014145ba7d214007 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 10:52:09 +0200 Subject: [PATCH 06/98] common: Add macro dt_omp_firstprivate() See https://redmine.darktable.org/issues/12568#note-14 Signed-off-by: Andreas Schneider --- src/common/darktable.h | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/common/darktable.h b/src/common/darktable.h index 12c21f65893b..3a4447a4c5d9 100644 --- a/src/common/darktable.h +++ b/src/common/darktable.h @@ -75,11 +75,23 @@ typedef unsigned int u_int; #endif #ifdef _OPENMP -#include -#else -#define omp_get_max_threads() 1 -#define omp_get_thread_num() 0 -#endif +# include + +/* See https://redmine.darktable.org/issues/12568#note-14 */ +# ifdef HAVE_OMP_FIRSTPRIVATE_WITH_CONST + /* If the compiler correctly supports firstprivate, use it. */ +# define dt_omp_firstprivate(...) firstprivate(__VA_ARGS__) +# else /* HAVE_OMP_FIRSTPRIVATE_WITH_CONST */ + /* This is needed for clang < 7.0 */ +# define dt_omp_firstprivate(...) +# endif/* HAVE_OMP_FIRSTPRIVATE_WITH_CONST */ + +#else /* _OPENMP */ + +# define omp_get_max_threads() 1 +# define omp_get_thread_num() 0 + +#endif /* _OPENMP */ #ifndef _RELEASE #include "common/poison.h" From f4dd7919ccf62d294db985d9a917e3f2558e9482 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 10 May 2019 22:29:05 +0200 Subject: [PATCH 07/98] common: Do not pass NULL to a %s format string darktable.h:559:3: error: '%s' directive argument is null [-Werror=format-overflow=] Signed-off-by: Andreas Schneider --- src/common/darktable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/darktable.h b/src/common/darktable.h index 3a4447a4c5d9..677efdc483b7 100644 --- a/src/common/darktable.h +++ b/src/common/darktable.h @@ -564,7 +564,7 @@ int dt_load_from_string(const gchar *image_to_load, gboolean open_image_in_dr, g #define dt_unreachable_codepath_with_desc(D) \ dt_unreachable_codepath_with_caller(D, __FILE__, __LINE__, __FUNCTION__) -#define dt_unreachable_codepath() dt_unreachable_codepath_with_caller(NULL, __FILE__, __LINE__, __FUNCTION__) +#define dt_unreachable_codepath() dt_unreachable_codepath_with_caller("unreachable", __FILE__, __LINE__, __FUNCTION__) static inline void dt_unreachable_codepath_with_caller(const char *description, const char *file, const int line, const char *function) { From 2bfcb170545e0bfd3ccb06a8265fdf1638f7310e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 11:07:25 +0200 Subject: [PATCH 08/98] common: Fix building bilateral.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/bilateral.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/common/bilateral.c b/src/common/bilateral.c index 7fd6e0a39f30..d6ef61862b05 100644 --- a/src/common/bilateral.c +++ b/src/common/bilateral.c @@ -127,7 +127,7 @@ void dt_bilateral_splat(dt_bilateral_t *b, const float *const in) const int oz = b->size_y * b->size_x; // splat into downsampled grid #ifdef _OPENMP -#pragma omp parallel for default(none) shared(b) +#pragma omp parallel for default(none) dt_omp_firstprivate(in, oy, oz) shared(b) #endif for(int j = 0; j < b->height; j++) { @@ -170,7 +170,9 @@ static void blur_line_z(float *buf, const int offset1, const int offset2, const const float w1 = 4.f / 16.f; const float w2 = 2.f / 16.f; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(size1, size2, size3, offset1, offset2, offset3) \ + shared(buf) #endif for(int k = 0; k < size1; k++) { @@ -208,7 +210,9 @@ static void blur_line(float *buf, const int offset1, const int offset2, const in const float w1 = 4.f / 16.f; const float w2 = 1.f / 16.f; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(size1, size2, size3, offset1, offset2, offset3) \ + shared(buf) #endif for(int k = 0; k < size1; k++) { @@ -260,7 +264,9 @@ void dt_bilateral_slice(const dt_bilateral_t *const b, const float *const in, fl const int oy = b->size_x; const int oz = b->size_y * b->size_x; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(b, in, norm, oy, oz) \ + shared(out) #endif for(int j = 0; j < b->height; j++) { @@ -306,7 +312,9 @@ void dt_bilateral_slice_to_output(const dt_bilateral_t *const b, const float *co const int oy = b->size_x; const int oz = b->size_y * b->size_x; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(b, in, norm, oy, oz) \ + shared(out) #endif for(int j = 0; j < b->height; j++) { From f4c79a8a4959d9ef36164a5b178817fcb1c9a94f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 11:14:22 +0200 Subject: [PATCH 09/98] common: Fix building color_picker.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/color_picker.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/common/color_picker.c b/src/common/color_picker.c index f32c7150924b..2cc5bba8a5d0 100644 --- a/src/common/color_picker.c +++ b/src/common/color_picker.c @@ -83,7 +83,8 @@ static void color_picker_helper_4ch_parallel(const dt_iop_buffer_dsc_t *dsc, con } #ifdef _OPENMP -#pragma omp parallel default(none) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(w, cst_to, pixel, width, box, mean, mmin, mmax) #endif { const int tnum = dt_get_thread_num(); @@ -205,7 +206,8 @@ static void color_picker_helper_bayer_parallel(const dt_iop_buffer_dsc_t *const } #ifdef _OPENMP -#pragma omp parallel default(none) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(pixel, width, roi, filters, box, msum, mmin, mmax, cnt) #endif { const int tnum = dt_get_thread_num(); @@ -332,7 +334,8 @@ static void color_picker_helper_xtrans_parallel(const dt_iop_buffer_dsc_t *const } #ifdef _OPENMP -#pragma omp parallel default(none) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(pixel, width, roi, xtrans, box, cnt, msum, mmin, mmax) #endif { const int tnum = dt_get_thread_num(); From da09f64b5207d09a0c9d016e2a6c4d83e36aae4e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 13:23:55 +0200 Subject: [PATCH 10/98] common: Fix building dwt.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/dwt.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/common/dwt.c b/src/common/dwt.c index 4f58786f113d..36e1a8a1803a 100644 --- a/src/common/dwt.c +++ b/src/common/dwt.c @@ -194,7 +194,10 @@ static void dwt_add_layer_sse(float *const img, float *layers, dwt_params_t *con const int i_size = p->width * p->height * 4; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(layers) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(img, i_size) \ + shared(layers) \ + schedule(static) #endif for(int i = 0; i < i_size; i += 4) { @@ -216,7 +219,10 @@ static void dwt_add_layer(float *const img, float *layers, dwt_params_t *const p const int i_size = p->width * p->height * p->ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(layers) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(img, i_size) \ + shared(layers) \ + schedule(static) #endif for(int i = 0; i < i_size; i++) layers[i] += img[i]; } @@ -233,7 +239,10 @@ static void dwt_subtract_layer_sse(float *bl, float *bh, dwt_params_t *const p) const int size = p->width * p->height * 4; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(bl, bh) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(v4_lpass_mult, size) \ + shared(bl, bh) \ + schedule(static) #endif for(int i = 0; i < size; i += 4) { @@ -258,7 +267,10 @@ static void dwt_subtract_layer(float *bl, float *bh, dwt_params_t *const p) const int size = p->width * p->height * p->ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(bl, bh) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(size) \ + shared(bl, bh) \ + schedule(static) #endif for(int i = 0; i < size; i++) { From c8ddb3f90fdabccf71d99a8b63fd9f2ec0f4b411 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 11 May 2019 13:30:59 +0200 Subject: [PATCH 11/98] common: Fix building gaussian.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/gaussian.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/gaussian.c b/src/common/gaussian.c index 545377e119b1..079806034ceb 100644 --- a/src/common/gaussian.c +++ b/src/common/gaussian.c @@ -173,8 +173,10 @@ void dt_gaussian_blur(dt_gaussian_t *g, const float *const in, float *const out) // vertical blur column by column #ifdef _OPENMP -#pragma omp parallel for default(none) shared(temp, Labmin, Labmax, a0, a1, a2, a3, b1, b2, coefp, \ - coefn) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, width, height, ch) \ + shared(temp, Labmin, Labmax, a0, a1, a2, a3, b1, b2, coefp, coefn) \ + schedule(static) #endif for(int i = 0; i < width; i++) { @@ -245,8 +247,10 @@ void dt_gaussian_blur(dt_gaussian_t *g, const float *const in, float *const out) // horizontal blur line by line #ifdef _OPENMP -#pragma omp parallel for default(none) shared(temp, Labmin, Labmax, a0, a1, a2, a3, b1, b2, coefp, \ - coefn) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(out, ch, width, height) \ + shared(temp, Labmin, Labmax, a0, a1, a2, a3, b1, b2, coefp, coefn) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -340,7 +344,10 @@ static void dt_gaussian_blur_4c_sse(dt_gaussian_t *g, const float *const in, flo // vertical blur column by column #ifdef _OPENMP -#pragma omp parallel for default(none) shared(temp, a0, a1, a2, a3, b1, b2, coefp, coefn) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, Labmin, Labmax, width, height) \ + shared(temp, a0, a1, a2, a3, b1, b2, coefp, coefn) \ + schedule(static) #endif for(int i = 0; i < width; i++) { @@ -408,7 +415,10 @@ static void dt_gaussian_blur_4c_sse(dt_gaussian_t *g, const float *const in, flo // horizontal blur line by line #ifdef _OPENMP -#pragma omp parallel for default(none) shared(temp, a0, a1, a2, a3, b1, b2, coefp, coefn) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(out, Labmin, Labmax, width, height) \ + shared(temp, a0, a1, a2, a3, b1, b2, coefp, coefn) \ + schedule(static) #endif for(size_t j = 0; j < height; j++) { From 4f69d702cd0089520eed703bce2082c288d402b4 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 09:10:16 +0200 Subject: [PATCH 12/98] common: Fix building heal.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/heal.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/common/heal.c b/src/common/heal.c index 37e53eb60450..56ae2310e1a4 100644 --- a/src/common/heal.c +++ b/src/common/heal.c @@ -54,7 +54,10 @@ static void dt_heal_sub(const float *const top_buffer, const float *const bottom const int i_size = width * height * ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(result_buffer) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(top_buffer, bottom_buffer, i_size) \ + shared(result_buffer) \ + schedule(static) #endif for(int i = 0; i < i_size; i++) result_buffer[i] = top_buffer[i] - bottom_buffer[i]; } @@ -66,7 +69,10 @@ static void dt_heal_add(const float *const first_buffer, const float *const seco const int i_size = width * height * ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(result_buffer) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(first_buffer, second_buffer, i_size) \ + shared(result_buffer) \ + schedule(static) #endif for(int i = 0; i < i_size; i++) result_buffer[i] = first_buffer[i] + second_buffer[i]; } @@ -78,7 +84,11 @@ static float dt_heal_laplace_iteration_sse(float *pixels, const float *const Adi float err = 0.f; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(pixels) schedule(static) reduction(+ : err) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(Adiag, Aidx, w, nmask_from, nmask_to) \ + shared(pixels) \ + schedule(static) \ + reduction(+ : err) #endif for(int i = nmask_from; i < nmask_to; i++) { @@ -135,7 +145,11 @@ static float dt_heal_laplace_iteration(float *pixels, const float *const Adiag, const int ch1 = (ch == 4) ? ch - 1 : ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(pixels) schedule(static) reduction(+ : err) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(Adiag, Aidx, w, nmask_from, nmask_to, ch1) \ + shared(pixels) \ + schedule(static) \ + reduction(+ : err) #endif for(int i = nmask_from; i < nmask_to; i++) { From 0d7d9455ba6cbbf9d406b8c03d3496b3c183d11d Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 09:14:41 +0200 Subject: [PATCH 13/98] common: Fix building histogram.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/histogram.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/histogram.c b/src/common/histogram.c index 91a2c3d3f575..53a07633c0f6 100644 --- a/src/common/histogram.c +++ b/src/common/histogram.c @@ -321,7 +321,10 @@ void dt_histogram_worker(dt_dev_histogram_collection_params_t *const histogram_p const dt_histogram_roi_t *const roi = histogram_params->roi; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(partial_hists) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(histogram_params, pixel, Worker, profile_info, bins_total, roi) \ + shared(partial_hists) \ + schedule(static) #endif for(int j = roi->crop_y; j < roi->height - roi->crop_height; j++) { @@ -334,7 +337,10 @@ void dt_histogram_worker(dt_dev_histogram_collection_params_t *const histogram_p memset(*histogram, 0, buf_size); uint32_t *hist = *histogram; -#pragma omp parallel for schedule(static) default(none) shared(hist, partial_hists) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(nthreads, bins_total) \ + shared(hist, partial_hists) \ + schedule(static) for(size_t k = 0; k < bins_total; k++) { for(size_t n = 0; n < nthreads; n++) From 1c837fb2de9a5c7b44829253aa4ac9e14a6c8cc4 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 20:11:36 +0200 Subject: [PATCH 14/98] common: Fix building imageio.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/imageio.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/common/imageio.c b/src/common/imageio.c index 4f7a7aef04bd..429ebae6cef7 100644 --- a/src/common/imageio.c +++ b/src/common/imageio.c @@ -182,7 +182,10 @@ void dt_imageio_flip_buffers(char *out, const char *in, const size_t bpp, const if(!orientation) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ht, wd, bpp, stride) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < ht; j++) memcpy(out + (size_t)j * bpp * wd, in + (size_t)j * stride, bpp * wd); return; @@ -205,7 +208,10 @@ void dt_imageio_flip_buffers(char *out, const char *in, const size_t bpp, const si = -si; } #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out, jj, ii, sj, si) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(wd, bpp, ht, stride) \ + shared(in, out, jj, ii, sj, si) \ + schedule(static) #endif for(int j = 0; j < ht; j++) { @@ -229,7 +235,10 @@ void dt_imageio_flip_buffers_ui16_to_float(float *out, const uint16_t *in, const if(!orientation) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(wd, ch, scale, stride, black, ht) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < ht; j++) for(int i = 0; i < wd; i++) @@ -255,7 +264,10 @@ void dt_imageio_flip_buffers_ui16_to_float(float *out, const uint16_t *in, const si = -si; } #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out, jj, ii, sj, si) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(wd, ch, black, scale, stride, ht) \ + shared(in, out, jj, ii, sj, si) \ + schedule(static) #endif for(int j = 0; j < ht; j++) { @@ -279,7 +291,10 @@ void dt_imageio_flip_buffers_ui8_to_float(float *out, const uint8_t *in, const f if(!orientation) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(wd, scale, black, ht, ch, stride) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < ht; j++) for(int i = 0; i < wd; i++) @@ -305,7 +320,10 @@ void dt_imageio_flip_buffers_ui8_to_float(float *out, const uint8_t *in, const f si = -si; } #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out, jj, ii, sj, si) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(wd, ch, scale, black, stride, ht) \ + shared(in, out, jj, ii, sj, si) \ + schedule(static) #endif for(int j = 0; j < ht; j++) { @@ -819,7 +837,9 @@ int dt_imageio_export_with_flags(const uint32_t imgid, const char *filename, { // !display_byteorder, need to swap: uint8_t *const buf8 = pipe.backbuf; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(processed_width, processed_height, buf8) \ + schedule(static) #endif // just flip byte order for(size_t k = 0; k < (size_t)processed_width * processed_height; k++) From fc2cb6f8039e1dce99c7385b03e6b06164b22bff Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 20:13:47 +0200 Subject: [PATCH 15/98] common: Fix building imageio_rawspeed.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/imageio_rawspeed.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/imageio_rawspeed.cc b/src/common/imageio_rawspeed.cc index dae2474ce781..cd8bc9724c25 100644 --- a/src/common/imageio_rawspeed.cc +++ b/src/common/imageio_rawspeed.cc @@ -387,7 +387,10 @@ dt_imageio_retval_t dt_imageio_open_rawspeed_sraw(dt_image_t *img, RawImage r, d */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(r, img, buf) +#pragma omp parallel for default(none) \ + schedule(static) \ + dt_omp_firstprivate(cpp) \ + shared(r, img, buf) #endif for(int j = 0; j < img->height; j++) { @@ -411,7 +414,10 @@ dt_imageio_retval_t dt_imageio_open_rawspeed_sraw(dt_image_t *img, RawImage r, d */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(r, img, buf) +#pragma omp parallel for default(none) \ + schedule(static) \ + dt_omp_firstprivate(cpp) \ + shared(r, img, buf) #endif for(int j = 0; j < img->height; j++) { From 272da0a42ce6b0622f676481f5348d8849b86951 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 20:21:07 +0200 Subject: [PATCH 16/98] common: Fix building interpolation.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/interpolation.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/common/interpolation.c b/src/common/interpolation.c index 7f6b731315c9..4aa63de63162 100644 --- a/src/common/interpolation.c +++ b/src/common/interpolation.c @@ -1476,7 +1476,9 @@ static void dt_interpolation_resample_plain(const struct dt_interpolation *itor, int64_t ts_resampling = getts(); #endif #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out, x0) \ + shared(out) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1522,7 +1524,9 @@ static void dt_interpolation_resample_plain(const struct dt_interpolation *itor, // Process each output line #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out) \ + shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) #endif for(int oy = 0; oy < roi_out->height; oy++) { @@ -1629,7 +1633,9 @@ static void dt_interpolation_resample_sse(const struct dt_interpolation *itor, f int64_t ts_resampling = getts(); #endif #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out, x0) \ + shared(out) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1675,7 +1681,9 @@ static void dt_interpolation_resample_sse(const struct dt_interpolation *itor, f // Process each output line #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out) \ + shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) #endif for(int oy = 0; oy < roi_out->height; oy++) { @@ -2075,7 +2083,9 @@ static void dt_interpolation_resample_1c_plain(const struct dt_interpolation *it int64_t ts_resampling = getts(); #endif #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out, x0) \ + shared(out) #endif for(int y = 0; y < roi_out->height; y++) { @@ -2121,7 +2131,9 @@ static void dt_interpolation_resample_1c_plain(const struct dt_interpolation *it // Process each output line #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, roi_out) \ + shared(out, hindex, hlength, hkernel, vindex, vlength, vkernel, vmeta) #endif for(int oy = 0; oy < roi_out->height; oy++) { From 118b295794e8f83226318c619a13f33dd16966ac Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 20:33:37 +0200 Subject: [PATCH 17/98] common: Fix building iop_order.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/iop_order.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/common/iop_order.c b/src/common/iop_order.c index 268a67783bd9..229f9cee8d74 100644 --- a/src/common/iop_order.c +++ b/src/common/iop_order.c @@ -1439,7 +1439,10 @@ static void _transform_from_to_rgb_lab_lcms2(const float *const image_in, float if(xform) { #ifdef _OPENMP -#pragma omp parallel for shared(xform) schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image_in, image_out, width, height) \ + shared(xform) \ + schedule(static) #endif for(int y = 0; y < height; y++) { @@ -1535,7 +1538,10 @@ static void _transform_rgb_to_rgb_lcms2(const float *const image_in, float *cons if(xform) { #ifdef _OPENMP -#pragma omp parallel for shared(xform) schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image_in, image_out, width, height) \ + shared(xform) \ + schedule(static) #endif for(int y = 0; y < height; y++) { @@ -1662,7 +1668,9 @@ static void _apply_tonecurves(const float *const image_in, float *const image_ou if((lut[0][0] >= 0.0f) && (lut[1][0] >= 0.0f) && (lut[2][0] >= 0.0f)) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(stride, image_in, image_out, lut, lutsize, unbounded_coeffs) \ + schedule(static) #endif for(size_t k = 0; k < stride; k += ch) { @@ -1676,7 +1684,9 @@ static void _apply_tonecurves(const float *const image_in, float *const image_ou else if((lut[0][0] >= 0.0f) || (lut[1][0] >= 0.0f) || (lut[2][0] >= 0.0f)) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(stride, image_in, image_out, lut, lutsize, unbounded_coeffs) \ + schedule(static) #endif for(size_t k = 0; k < stride; k += ch) { @@ -1707,7 +1717,9 @@ static void _transform_rgb_to_lab_matrix(const float *const image_in, float *con profile_info->lutsize); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image_out, profile_info, stride) \ + schedule(static) #endif for(size_t y = 0; y < stride; y++) { @@ -1722,7 +1734,9 @@ static void _transform_rgb_to_lab_matrix(const float *const image_in, float *con else { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image_in, image_out, profile_info, stride) \ + schedule(static) #endif for(size_t y = 0; y < stride; y++) { @@ -1745,7 +1759,9 @@ static void _transform_lab_to_rgb_matrix(const float *const image_in, float *con const size_t stride = (size_t)width * height; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image_in, image_out, stride, profile_info) \ + schedule(static) #endif for(size_t y = 0; y < stride; y++) { @@ -1779,7 +1795,9 @@ static void _transform_matrix_rgb(const float *const image_in, float *const imag profile_info_from->unbounded_coeffs_in[2], profile_info_from->lutsize); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(stride, image_out, profile_info_from, profile_info_to) \ + schedule(static) #endif for(size_t y = 0; y < stride; y++) { @@ -1794,7 +1812,9 @@ static void _transform_matrix_rgb(const float *const image_in, float *const imag else { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(stride, image_in, image_out, profile_info_from, profile_info_to) \ + schedule(static) #endif for(size_t y = 0; y < stride; y++) { From 76cb3555d932fb57090fb036f312122949eb77f3 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 21:11:23 +0200 Subject: [PATCH 18/98] common: Fix building locallaplacian.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/locallaplacian.c | 99 +++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/src/common/locallaplacian.c b/src/common/locallaplacian.c index 436658191fa4..14bedc5bee7e 100644 --- a/src/common/locallaplacian.c +++ b/src/common/locallaplacian.c @@ -114,7 +114,10 @@ static inline void gauss_expand( const int ht) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) collapse(2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fine, input, wd, ht) \ + schedule(static) \ + collapse(2) #endif for(int j=1;j<((ht-1)&~1);j++) // even ht: two px boundary. odd ht: one px. for(int i=1;i<((wd-1)&~1);i++) @@ -151,7 +154,9 @@ static inline void gauss_reduce_sse2( float *const row = ringbuf + (rowj % 5)*stride; const float *const in = input + rowj*wd; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cw, in, row) \ + schedule(static) #endif for(int i=1;imode == 2) { // pad by preview buffer #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) shared(wd2, ht2) collapse(2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ht, input, max_supp, out, wd) \ + shared(wd2, ht2) \ + schedule(dynamic) \ + collapse(2) #endif // fill regular pixels: for(int j=0;j [0,1] @@ -276,22 +290,38 @@ static inline float *ll_pad_input( out[*wd2*j+i] = b->pad0[b->pwd*py+px];\ } } while(0) #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) shared(wd2, ht2, b) collapse(2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(input, max_supp, out, wd) \ + shared(wd2, ht2, b) \ + schedule(dynamic) \ + collapse(2) #endif // left border for(int j=max_supp;j<*ht2-max_supp;j++) for(int i=0;i [0,1] } #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) shared(wd2, ht2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(max_supp, out) \ + shared(wd2, ht2) \ + schedule(dynamic) #endif for(int j=0;j Date: Mon, 20 May 2019 21:20:14 +0200 Subject: [PATCH 19/98] common: Fix building opencl.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/opencl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/opencl.c b/src/common/opencl.c index 9f3d678a08fa..19230d157993 100644 --- a/src/common/opencl.c +++ b/src/common/opencl.c @@ -981,7 +981,9 @@ static float dt_opencl_benchmark_gpu(const int devid, const size_t width, const if(buf == NULL) goto error; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, tea_states, width) \ + shared(buf) #endif for(size_t j = 0; j < height; j++) { @@ -1054,7 +1056,9 @@ static float dt_opencl_benchmark_cpu(const size_t width, const size_t height, co if(buf == NULL) goto error; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width, tea_states) \ + shared(buf) #endif for(size_t j = 0; j < height; j++) { From 3b4f217308ea85dd492fc8625c7fb35d8c87bbf6 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 18:32:28 +0200 Subject: [PATCH 20/98] common: Fix building focus.h with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/common/focus.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/focus.h b/src/common/focus.h index d91c16a1f2fd..e2de6348277f 100644 --- a/src/common/focus.h +++ b/src/common/focus.h @@ -46,7 +46,10 @@ static inline void _dt_focus_cdf22_wtf(uint8_t *buf, const int l, const int widt const int st = step / 2; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, st, step, width) \ + shared(buf) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -66,7 +69,10 @@ static inline void _dt_focus_cdf22_wtf(uint8_t *buf, const int l, const int widt gbuf(buf, i, j) += _from_uint8(gbuf(buf, i - st, j)) / 2; } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, st, step, width) \ + shared(buf) \ + schedule(static) #endif for(int i = 0; i < width; i++) { From a393076103de7b903b2a55ce87be1a1b4776f76e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 20 May 2019 21:22:11 +0200 Subject: [PATCH 21/98] control:jobs: Fix building contro_jobs.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/control/jobs/control_jobs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/control/jobs/control_jobs.c b/src/control/jobs/control_jobs.c index 43d6ab4be7b4..e3f05aa28630 100644 --- a/src/control/jobs/control_jobs.c +++ b/src/control/jobs/control_jobs.c @@ -368,7 +368,10 @@ static int dt_control_merge_hdr_process(dt_imageio_module_data_t *datai, const c float saturation = 1.0f; d->whitelevel = fmaxf(d->whitelevel, saturation * cal); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(d, saturation) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, cal, photoncnt) \ + shared(d, saturation) \ + schedule(static) #endif for(int y = 0; y < d->ht; y++) for(int x = 0; x < d->wd; x++) From ef4bbb2c37b7af6eceb2fd8d5998f88a045a3b45 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 21 May 2019 21:42:18 +0200 Subject: [PATCH 22/98] develop: Fix building blend.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/blend.c | 58 ++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/src/develop/blend.c b/src/develop/blend.c index 50be36ed2b34..99e5a0a82147 100644 --- a/src/develop/blend.c +++ b/src/develop/blend.c @@ -2849,7 +2849,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // blend uniformly (no drawn or parametric mask) #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, opacity) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = opacity; } @@ -2865,12 +2866,16 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // invert if required if(d->raster_mask_invert) #ifdef _OPENMP - #pragma omp parallel for default(none) shared(raster_mask) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, opacity) \ + shared(raster_mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = (1.0 - raster_mask[i]) * opacity; else #ifdef _OPENMP - #pragma omp parallel for default(none) shared(raster_mask) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, opacity) \ + shared(raster_mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = raster_mask[i] * opacity; if(free_mask) dt_free_align(raster_mask); @@ -2880,7 +2885,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // fallback for when the raster mask couldn't be applied const float value = d->raster_mask_invert ? 0.0 : 1.0; #ifdef _OPENMP - #pragma omp parallel for default(none) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, value) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = value; } @@ -2900,7 +2906,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp { // if we have a mask and this flag is set -> invert the mask #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = 1.0f - mask[i]; } @@ -2911,7 +2918,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // we fill the buffer with 1.0f or 0.0f depending on mask_combine const float fill = (d->mask_combine & DEVELOP_COMBINE_MASKS_POS) ? 0.0f : 1.0f; #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, fill) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = fill; } @@ -2920,14 +2928,17 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // we fill the buffer with 1.0f or 0.0f depending on mask_combine const float fill = (d->mask_combine & DEVELOP_COMBINE_INCL) ? 0.0f : 1.0f; #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, fill) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = fill; } // get parametric mask (if any) and apply global opacity #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bch, ch, cst, d, oheight, opacity, ivoid, iwidth, \ + mask, owidth, ovoid, work_profile, xoffs, yoffs) #endif for(size_t y = 0; y < oheight; y++) { @@ -2966,7 +2977,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp { float *const guide_tmp = dt_alloc_align(64, sizeof(*guide_tmp) * buffsize * ch); #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, guide_tmp, ivoid, iwidth, oheight, owidth, xoffs, yoffs) #endif for(size_t y = 0; y < oheight; y++) { @@ -2999,7 +3011,8 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp const float e = expf(3.f * d->contrast); const float brightness = d->brightness; #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(brightness, buffsize, e, mask, opacity) #endif for(size_t k = 0; k < buffsize; k++) { @@ -3028,7 +3041,10 @@ void dt_develop_blend_process(struct dt_iop_module_t *self, struct dt_dev_pixelp // select the blend operator _blend_row_func *const blend = dt_develop_choose_blend_func(d->blend_mode); #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bch, blend, blendflag, ch, cst, ivoid, iwidth, mask, \ + mask_display, oheight, ovoid, owidth, \ + request_mask_display, work_profile, xoffs, yoffs) #endif for(size_t y = 0; y < oheight; y++) { @@ -3223,12 +3239,16 @@ int dt_develop_blend_process_cl(struct dt_iop_module_t *self, struct dt_dev_pixe // invert if required if(d->raster_mask_invert) #ifdef _OPENMP - #pragma omp parallel for default(none) shared(raster_mask) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, opacity) \ + shared(raster_mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = (1.0 - raster_mask[i]) * opacity; else #ifdef _OPENMP - #pragma omp parallel for default(none) shared(raster_mask) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, opacity) \ + shared(raster_mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = raster_mask[i] * opacity; if(free_mask) dt_free_align(raster_mask); @@ -3238,7 +3258,8 @@ int dt_develop_blend_process_cl(struct dt_iop_module_t *self, struct dt_dev_pixe // fallback for when the raster mask couldn't be applied const float value = d->raster_mask_invert ? 0.0 : 1.0; #ifdef _OPENMP - #pragma omp parallel for default(none) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask, value) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = value; } @@ -3261,7 +3282,8 @@ int dt_develop_blend_process_cl(struct dt_iop_module_t *self, struct dt_dev_pixe { // if we have a mask and this flag is set -> invert the mask #ifdef _OPENMP - #pragma omp parallel for default(none) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = 1.0f - mask[i]; } @@ -3272,7 +3294,8 @@ int dt_develop_blend_process_cl(struct dt_iop_module_t *self, struct dt_dev_pixe // we fill the buffer with 1.0f or 0.0f depending on mask_combine const float fill = (d->mask_combine & DEVELOP_COMBINE_MASKS_POS) ? 0.0f : 1.0f; #ifdef _OPENMP - #pragma omp parallel for default(none) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, fill, mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = fill; } @@ -3281,7 +3304,8 @@ int dt_develop_blend_process_cl(struct dt_iop_module_t *self, struct dt_dev_pixe // we fill the buffer with 1.0f or 0.0f depending on mask_combine const float fill = (d->mask_combine & DEVELOP_COMBINE_INCL) ? 0.0f : 1.0f; #ifdef _OPENMP - #pragma omp parallel for default(none) + #pragma omp parallel for default(none) \ + dt_omp_firstprivate(buffsize, fill, mask) #endif for(size_t i = 0; i < buffsize; i++) mask[i] = fill; } From 55a7cce8d413d79126810e884fc5bb3a6aa52693 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 21 May 2019 22:09:17 +0200 Subject: [PATCH 23/98] develop: Fix building imageop_math.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/imageop_math.c | 55 +++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/develop/imageop_math.c b/src/develop/imageop_math.c index 1403f3493a48..fadc2a3173b9 100644 --- a/src/develop/imageop_math.c +++ b/src/develop/imageop_math.c @@ -67,7 +67,10 @@ void dt_iop_flip_and_zoom_8(const uint8_t *in, int32_t iw, int32_t ih, uint8_t * const int32_t offm = half_pixel * bpp * MIN(MIN(0, si), MIN(sj, si + sj)); const int32_t offM = half_pixel * bpp * MAX(MAX(0, si), MAX(sj, si + sj)); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out, jj, ii, sj, si, iw, ih) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bpp, half_pixel, ht, offM, offm, scale, wd) \ + shared(in, out, jj, ii, sj, si, iw, ih) \ + schedule(static) #endif for(uint32_t j = 0; j < ht; j++) { @@ -211,7 +214,9 @@ void dt_iop_clip_and_zoom_mosaic_half_size_plain(uint16_t *const out, const uint } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(clut) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(filters, in, in_stride, out, out_stride, px_footprint, rggbx, rggby, roi_in, roi_out) \ + shared(clut) schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -270,7 +275,9 @@ void dt_iop_clip_and_zoom_mosaic_half_size_sse2(uint16_t *const out, const uint1 const int rggbx = trggbx, rggby = trggby; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out, out_stride, px_footprint, rggbx, rggby, roi_in, roi_out, samples) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -479,7 +486,9 @@ void dt_iop_clip_and_zoom_mosaic_half_size_f_plain(float *const out, const float const int rggbx = trggbx, rggby = trggby; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out, out_stride, px_footprint, rggbx, rggby, roi_in, roi_out, samples) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -666,7 +675,10 @@ void dt_iop_clip_and_zoom_mosaic_half_size_f_sse2(float *const out, const float const int rggbx = trggbx, rggby = trggby; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out, out_stride, px_footprint, rggbx, \ + rggby, roi_in, roi_out, samples) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -867,7 +879,9 @@ void dt_iop_clip_and_zoom_mosaic_third_size_xtrans(uint16_t *const out, const ui // sample (rounded to nearest input pixel) to anti-alias. Higher MP // images need larger filters to avoid artifacts. #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out, out_stride, px_footprint, roi_in, roi_out, xtrans) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -906,7 +920,9 @@ void dt_iop_clip_and_zoom_mosaic_third_size_xtrans_f(float *const out, const flo { const float px_footprint = 1.f / roi_out->scale; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out, out_stride, px_footprint, roi_in, roi_out, xtrans) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -951,7 +967,10 @@ void dt_iop_clip_and_zoom_demosaic_passthrough_monochrome_f_plain(float *out, co const int samples = round(px_footprint); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, px_footprint, roi_in, roi_out, samples) \ + shared(out) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1093,7 +1112,10 @@ void dt_iop_clip_and_zoom_demosaic_passthrough_monochrome_f_sse2(float *out, con const int samples = round(px_footprint); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, px_footprint, roi_in, roi_out, samples) \ + shared(out) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1347,7 +1369,10 @@ void dt_iop_clip_and_zoom_demosaic_half_size_f_plain(float *out, const float *co const int rggbx = trggbx, rggby = trggby; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, px_footprint, rggbx, rggby, roi_in, roi_out, samples) \ + shared(out) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1523,7 +1548,10 @@ void dt_iop_clip_and_zoom_demosaic_half_size_f_sse2(float *out, const float *con const int rggbx = trggbx, rggby = trggby; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, px_footprint, rggbx, rggby, out_stride, roi_in, roi_out, samples) \ + shared(out) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -1712,7 +1740,10 @@ void dt_iop_clip_and_zoom_demosaic_third_size_xtrans_f(float *out, const float * // by non-integer number of samples. #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, in_stride, out_stride, px_footprint, roi_in, roi_out, samples, xtrans) \ + shared(out) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { From ff63f60f8d994f3f678ba0203981bcf3e70effc5 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 21 May 2019 22:15:32 +0200 Subject: [PATCH 24/98] develop:masks: Fix building ellipse.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/masks/ellipse.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/develop/masks/ellipse.c b/src/develop/masks/ellipse.c index b2bfa2b0a53c..231e56b945d8 100644 --- a/src/develop/masks/ellipse.c +++ b/src/develop/masks/ellipse.c @@ -1630,7 +1630,9 @@ static int dt_ellipse_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(iscale, mh, mw, py, px) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -1688,7 +1690,9 @@ static int dt_ellipse_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points, a, b, ta, tb, alpha) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(center, mh, mw) \ + shared(points, a, b, ta, tb, alpha) #else #pragma omp parallel for shared(points, a, b, ta, tb, alpha) #endif @@ -1720,7 +1724,9 @@ static int dt_ellipse_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop // we fill the output buffer by interpolation #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(h, mw, w) \ + shared(points, buffer) #else #pragma omp parallel for shared(points, buffer) #endif From a09da58bdfa686b954abd6f8a2f5d20b86b5917e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 21 May 2019 22:22:15 +0200 Subject: [PATCH 25/98] develop:masks: Fix building gradient.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/masks/gradient.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/develop/masks/gradient.c b/src/develop/masks/gradient.c index 075d2d23ab76..bba675dd86f5 100644 --- a/src/develop/masks/gradient.c +++ b/src/develop/masks/gradient.c @@ -823,7 +823,9 @@ static int dt_gradient_get_mask(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(mh, mw, px, py) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -867,7 +869,9 @@ static int dt_gradient_get_mask(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cosv, hwscale, normf, offset, mh, mw, steepness, sinv) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -897,7 +901,9 @@ static int dt_gradient_get_mask(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t // we fill the mask buffer by interpolation #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(h, mw, w) \ + shared(points, buffer) #else #pragma omp parallel for shared(points, buffer) #endif @@ -951,7 +957,9 @@ static int dt_gradient_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_io #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(iscale, mh, mw, py, px) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -997,7 +1005,9 @@ static int dt_gradient_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_io #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cosv, hwscale, mh, mw, normf, offset, sinv, steepness) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -1020,7 +1030,9 @@ static int dt_gradient_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_io // we fill the mask buffer by interpolation #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(h, mw, w) \ + shared(points, buffer) #else #pragma omp parallel for shared(points, buffer) #endif From 19d50fb4cd9cafbc13a16286a635eae1629d43c3 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 22 May 2019 21:57:21 +0200 Subject: [PATCH 26/98] develop:masks: Fix building group.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/masks/group.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/develop/masks/group.c b/src/develop/masks/group.c index ff3040196754..62bfbdaa9e9e 100644 --- a/src/develop/masks/group.c +++ b/src/develop/masks/group.c @@ -485,7 +485,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(bufs) #else #pragma omp parallel for shared(bufs) #endif @@ -502,7 +504,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, op, width) \ + shared(bufs, buffer) #else #pragma omp parallel for shared(bufs, buffer) #endif @@ -518,7 +522,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, op, width) \ + shared(bufs, buffer) #else #pragma omp parallel for shared(bufs, buffer) #endif @@ -539,7 +545,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, op, width) \ + shared(bufs, buffer) #else #pragma omp parallel for shared(bufs, buffer) #endif @@ -557,7 +565,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, op, width) \ + shared(bufs, buffer) #else #pragma omp parallel for shared(bufs, buffer) #endif @@ -578,7 +588,9 @@ static int dt_group_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_t { #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(bufs, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, op, width) \ + shared(bufs, buffer) #else #pragma omp parallel for shared(bufs, buffer) #endif From 0d08e269b3c78bc2b4da36a9c47d42bd38c9ab74 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 22 May 2019 22:03:46 +0200 Subject: [PATCH 27/98] develop:masks: Fix building circle.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/masks/circle.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/develop/masks/circle.c b/src/develop/masks/circle.c index 8f2b8b062b4a..a1f81c92c724 100644 --- a/src/develop/masks/circle.c +++ b/src/develop/masks/circle.c @@ -941,7 +941,9 @@ static int dt_circle_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_ #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(iscale, mh, mw, px, py) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -980,7 +982,9 @@ static int dt_circle_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_ #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(center, mh, mw, radius2, total2) \ + shared(points) #else #pragma omp parallel for shared(points) #endif @@ -1007,7 +1011,9 @@ static int dt_circle_get_mask_roi(dt_iop_module_t *module, dt_dev_pixelpipe_iop_ // we fill the output buffer by interpolation #ifdef _OPENMP #if !defined(__SUNOS__) && !defined(__NetBSD__) -#pragma omp parallel for default(none) shared(points, buffer) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(h, mw, w) \ + shared(points, buffer) #else #pragma omp parallel for shared(points, buffer) #endif From 1a41676becd9ed0c98e70eeb9d63e608192a4eb1 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 18:11:49 +0200 Subject: [PATCH 28/98] develop: Fix building pixelpipe_hb.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/pixelpipe_hb.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/develop/pixelpipe_hb.c b/src/develop/pixelpipe_hb.c index 7a156ba7a6e6..7a237e20e6be 100644 --- a/src/develop/pixelpipe_hb.c +++ b/src/develop/pixelpipe_hb.c @@ -1148,7 +1148,10 @@ static int dt_dev_pixelpipe_process_rec(dt_dev_pixelpipe_t *pipe, dt_develop_t * const int cp_height = MIN(roi_out->height, pipe->iheight - in_y); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(pipe, roi_out, roi_in, output) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bpp, cp_height, cp_width, in_x, in_y) \ + shared(pipe, roi_out, roi_in, output) \ + schedule(static) #endif for(int j = 0; j < cp_height; j++) memcpy(((char *)*output) + (size_t)bpp * j * roi_out->width, @@ -1253,7 +1256,10 @@ static int dt_dev_pixelpipe_process_rec(dt_dev_pixelpipe_t *pipe, dt_develop_t * else { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(roi_out, roi_in, output, input) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in_bpp, out_bpp) \ + shared(roi_out, roi_in, output, input) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) memcpy(((char *)*output) + (size_t)out_bpp * j * roi_out->width, @@ -1262,7 +1268,10 @@ static int dt_dev_pixelpipe_process_rec(dt_dev_pixelpipe_t *pipe, dt_develop_t * } #else // don't HAVE_OPENCL #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(roi_out, roi_in, output, input) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in_bpp, out_bpp) \ + shared(roi_out, roi_in, output, input) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) memcpy(((char *)*output) + (size_t)out_bpp * j * roi_out->width, From 3ccef5a01525af7fc3bcdbb6a2b70eac03e61506 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 18:22:36 +0200 Subject: [PATCH 29/98] develop: Fix building tiling.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/tiling.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/develop/tiling.c b/src/develop/tiling.c index e2521fc68a78..4c1fbe558746 100644 --- a/src/develop/tiling.c +++ b/src/develop/tiling.c @@ -753,7 +753,10 @@ static void _default_process_tiling_ptp(struct dt_iop_module_t *self, struct dt_ /* prepare input tile buffer */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(input, width, ioffs) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ht, in_bpp, ipitch, ivoid, wd) \ + shared(input, width, ioffs) \ + schedule(static) #endif for(size_t j = 0; j < ht; j++) memcpy((char *)input + j * wd * in_bpp, (char *)ivoid + ioffs + j * ipitch, (size_t)wd * in_bpp); @@ -794,7 +797,10 @@ static void _default_process_tiling_ptp(struct dt_iop_module_t *self, struct dt_ /* copy "good" part of tile to output buffer */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(ooffs, output, width, origin, region) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(opitch, out_bpp, ovoid, wd) \ + shared(ooffs, output, width, origin, region) \ + schedule(static) #endif for(size_t j = 0; j < region[1]; j++) memcpy((char *)ovoid + ooffs + j * opitch, @@ -1096,7 +1102,10 @@ static void _default_process_tiling_roi(struct dt_iop_module_t *self, struct dt_ } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(input, ioffs, iroi_full) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in_bpp, ipitch, ivoid) \ + shared(input, ioffs, iroi_full) \ + schedule(static) #endif for(size_t j = 0; j < iroi_full.height; j++) memcpy((char *)input + j * iroi_full.width * in_bpp, (char *)ivoid + ioffs + j * ipitch, @@ -1125,7 +1134,10 @@ static void _default_process_tiling_roi(struct dt_iop_module_t *self, struct dt_ const int origin_x = oroi_good.x - oroi_full.x; const int origin_y = oroi_good.y - oroi_full.y; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(ooffs, output, oroi_good, oroi_full) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(opitch, origin_x, origin_y, out_bpp, ovoid) \ + shared(ooffs, output, oroi_good, oroi_full) \ + schedule(static) #endif for(size_t j = 0; j < oroi_good.height; j++) memcpy((char *)ovoid + ooffs + j * opitch, @@ -1408,7 +1420,10 @@ static int _default_process_tiling_cl_ptp(struct dt_iop_module_t *self, struct d { /* prepare pinned input tile buffer: copy part of input image */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(input_buffer, width, ioffs, wd, ht) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in_bpp, ipitch, ivoid) \ + shared(input_buffer, width, ioffs, wd, ht) \ + schedule(static) #endif for(size_t j = 0; j < ht; j++) memcpy((char *)input_buffer + j * wd * in_bpp, (char *)ivoid + ioffs + j * ipitch, @@ -1863,7 +1878,9 @@ static int _default_process_tiling_cl_roi(struct dt_iop_module_t *self, struct d { /* prepare pinned input tile buffer: copy part of input image */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(input_buffer, width, ioffs, iroi_full) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in_bpp, ipitch, ivoid) \ + shared(input_buffer, width, ioffs, iroi_full) schedule(static) #endif for(size_t j = 0; j < iroi_full.height; j++) memcpy((char *)input_buffer + j * iroi_full.width * in_bpp, (char *)ivoid + ioffs + j * ipitch, @@ -1910,8 +1927,10 @@ static int _default_process_tiling_cl_roi(struct dt_iop_module_t *self, struct d /* copy "good" part of tile from pinned output buffer to output image */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(ooffs, output_buffer, oroi_full, oorigin, \ - oregion) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ipitch, opitch, ovoid, out_bpp) \ + shared(ooffs, output_buffer, oroi_full, oorigin, oregion) \ + schedule(static) #endif for(size_t j = 0; j < oregion[1]; j++) memcpy((char *)ovoid + ooffs + j * opitch, From 67d49fb3a89bf8ef5f141c8f4a8502ce653a8455 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:31:05 +0200 Subject: [PATCH 30/98] gui: Fix building draw.h with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/gui/draw.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gui/draw.h b/src/gui/draw.h index 89300421e6ed..9a0b9c3844a3 100644 --- a/src/gui/draw.h +++ b/src/gui/draw.h @@ -24,6 +24,7 @@ #include "config.h" #endif +#include "common/darktable.h" #include "common/curve_tools.h" #include #include @@ -256,14 +257,20 @@ static inline void dt_draw_curve_calc_values(dt_draw_curve_t *c, const float min if(x) { #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(x) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(res) \ + shared(x) \ + schedule(static) #endif for(int k = 0; k < res; k++) x[k] = k * (1.0f / res); } if(y) { #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(y, c) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(min, max, res) \ + shared(y, c) \ + schedule(static) #endif for(int k = 0; k < res; k++) y[k] = min + (max - min) * c->csample.m_Samples[k] * (1.0f / 0x10000); } From c80df82799370728722bae58323ac6383ec3cdde Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:42:32 +0200 Subject: [PATCH 31/98] gui: Fix building hotpixels.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/hotpixels.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/iop/hotpixels.c b/src/iop/hotpixels.c index bd9f461b8354..578222dcdfc7 100644 --- a/src/iop/hotpixels.c +++ b/src/iop/hotpixels.c @@ -121,7 +121,11 @@ static int process_bayer(const dt_iop_hotpixels_data_t *data, int fixed = 0; #ifdef _OPENMP -#pragma omp parallel for default(none) reduction(+ : fixed) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, markfixed, min_neighbours, multiplier, ovoid, \ + roi_out, threshold, width, widthx2) \ + reduction(+ : fixed) \ + schedule(static) #endif for(int row = 2; row < roi_out->height - 2; row++) { @@ -218,7 +222,12 @@ static int process_xtrans(const dt_iop_hotpixels_data_t *data, int fixed = 0; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(offsets) reduction(+ : fixed) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, markfixed, min_neighbours, multiplier, ovoid, \ + roi_out, threshold, xtrans, width) \ + shared(offsets) \ + reduction(+ : fixed) \ + schedule(static) #endif for(int row = 2; row < roi_out->height - 2; row++) { From a59177a5b61d48ac5d2a86dcfe067628189c932e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 18:53:12 +0200 Subject: [PATCH 32/98] iop: Fix building lens.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/lens.c | 51 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/src/iop/lens.c b/src/iop/lens.c index 9737d718e613..c0436481ff1f 100644 --- a/src/iop/lens.c +++ b/src/iop/lens.c @@ -374,7 +374,11 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c void *buf = dt_alloc_align(64, bufsize * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bufsize, ch, ch_width, d, interpolation, ivoid, \ + mask_display, ovoid, roi_in, roi_out) \ + shared(buf, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -428,7 +432,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c if(modflags & LF_MODIFY_VIGNETTING) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, pixelformat, roi_out, ovoid) \ + shared(modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -450,7 +457,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c if(modflags & LF_MODIFY_VIGNETTING) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, pixelformat, roi_in) \ + shared(buf, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_in->height; y++) { @@ -469,7 +479,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c void *buf2 = dt_alloc_align(64, buf2size * sizeof(float) * dt_get_num_threads()); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf2, buf, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buf2size, ch, ch_width, d, interpolation, mask_display, ovoid, roi_in, roi_out) \ + shared(buf2, buf, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -620,7 +633,10 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m if(modflags & (LF_MODIFY_TCA | LF_MODIFY_DISTORTION | LF_MODIFY_GEOMETRY | LF_MODIFY_SCALE)) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmpbuf, d, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(tmpbufwidth, roi_out) \ + shared(tmpbuf, d, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -656,7 +672,10 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m if(modflags & LF_MODIFY_VIGNETTING) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmpbuf, modifier, d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, pixelformat, roi_out) \ + shared(tmpbuf, modifier, d) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -695,7 +714,10 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m if(modflags & LF_MODIFY_VIGNETTING) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmpbuf, modifier, d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, pixelformat, roi_in) \ + shared(tmpbuf, modifier, d) \ + schedule(static) #endif for(int y = 0; y < roi_in->height; y++) { @@ -729,7 +751,10 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m if(modflags & (LF_MODIFY_TCA | LF_MODIFY_DISTORTION | LF_MODIFY_GEOMETRY | LF_MODIFY_SCALE)) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmpbuf, d, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(tmpbufwidth, roi_out) \ + shared(tmpbuf, d, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -889,7 +914,10 @@ void distort_mask(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *p float *buf = dt_alloc_align(64, bufsize * sizeof(float) * dt_get_num_threads()); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf, modifier) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(bufsize, d, in, interpolation, out, roi_in, roi_out) \ + shared(buf, modifier) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -956,7 +984,10 @@ void modify_roi_in(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t * float *const buf = dt_alloc_align(64, nbpoints * 2 * 3 * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel default(none) shared(modifier) reduction(min : xm, ym) reduction(max : xM, yM) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(aheight, awidth, buf, height, nbpoints, width, xoff, \ + xstep, yoff, ystep) \ + shared(modifier) reduction(min : xm, ym) reduction(max : xM, yM) #endif { #ifdef _OPENMP From 21abad461784b2dbb861b404819700048a70f77e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 18:57:33 +0200 Subject: [PATCH 33/98] iop: Fix building lut3d.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/lut3d.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/iop/lut3d.c b/src/iop/lut3d.c index d7ab5f6b4e84..3bd3a4483398 100644 --- a/src/iop/lut3d.c +++ b/src/iop/lut3d.c @@ -111,7 +111,9 @@ void correct_pixel_trilinear(const float *const in, float *const out, { const int level2 = level * level; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(clut, in, level, level2, out, pixel_nb) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)(pixel_nb * 4); k+=4) { @@ -188,7 +190,9 @@ void correct_pixel_tetrahedral(const float *const in, float *const out, { const int level2 = level * level; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(clut, in, level, level2, out, pixel_nb) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)(pixel_nb * 4); k+=4) { @@ -274,7 +278,9 @@ void correct_pixel_pyramid(const float *const in, float *const out, { const int level2 = level * level; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(clut, in, level, level2, out, pixel_nb) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)(pixel_nb * 4); k+=4) { From a707d442303295c7935966fe558f68cb943a25d7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 19:02:01 +0200 Subject: [PATCH 34/98] iop: Fix building imageop_math.h with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/develop/imageop_math.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/develop/imageop_math.h b/src/develop/imageop_math.h index 7203fa76b133..0b4acf8e6799 100644 --- a/src/develop/imageop_math.h +++ b/src/develop/imageop_math.h @@ -158,7 +158,10 @@ static inline float dt_iop_eval_exp(const float *const coeff, const float x) static inline void dt_iop_alpha_copy(const void *ivoid, void *ovoid, const int width, const int height) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(ovoid, ivoid) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(ovoid, ivoid) \ + schedule(static) #endif for(int j = 0; j < height; j++) { From 3b031f087f4aa235103f13a78b3e554f3ea34559 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 20:48:22 +0200 Subject: [PATCH 35/98] iop: Fix building hazeremoval.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/hazeremoval.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/iop/hazeremoval.c b/src/iop/hazeremoval.c index 56f570a84b4d..1d6012dc8ec7 100644 --- a/src/iop/hazeremoval.c +++ b/src/iop/hazeremoval.c @@ -354,7 +354,9 @@ static void box_max(const gray_image img1, const gray_image img2, const int w) if(img1.data == img2.data) { #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { img2_bak = new_gray_image(img2.width, 1); @@ -372,7 +374,9 @@ static void box_max(const gray_image img1, const gray_image img2, const int w) else { #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { #ifdef _OPENMP @@ -383,7 +387,9 @@ static void box_max(const gray_image img1, const gray_image img2, const int w) } } #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { img2_bak = new_gray_image(1, img2.height); @@ -427,7 +433,9 @@ static void box_min(const gray_image img1, const gray_image img2, const int w) if(img1.data == img2.data) { #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { img2_bak = new_gray_image(img2.width, 1); @@ -445,7 +453,9 @@ static void box_min(const gray_image img1, const gray_image img2, const int w) else { #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { #ifdef _OPENMP @@ -456,7 +466,9 @@ static void box_min(const gray_image img1, const gray_image img2, const int w) } } #ifdef _OPENMP -#pragma omp parallel default(none) private(img2_bak) +#pragma omp parallel default(none) \ + dt_omp_firstprivate(img1, img2, w) \ + private(img2_bak) #endif { img2_bak = new_gray_image(1, img2.height); @@ -478,7 +490,9 @@ static void dark_channel(const const_rgb_image img1, const gray_image img2, cons { const size_t size = (size_t)img1.height * img1.width; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(img1, img2, size) \ + schedule(static) #endif for(size_t i = 0; i < size; i++) { @@ -498,7 +512,9 @@ static void transition_map(const const_rgb_image img1, const gray_image img2, co { const size_t size = (size_t)img1.height * img1.width; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(A0, img1, img2, size, strength) \ + schedule(static) #endif for(size_t i = 0; i < size; i++) { @@ -605,7 +621,10 @@ static float ambient_light(const const_rgb_image img, int w1, rgb_pixel *pA0) size_t N_bright_hazy = 0; const float *const data = dark_ch.data; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) reduction(+ : N_bright_hazy, A0_r, A0_g, A0_b) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(crit_brightness, crit_haze_level, data, img, size) \ + schedule(static) \ + reduction(+ : N_bright_hazy, A0_r, A0_g, A0_b) #endif for(size_t i = 0; i < size; i++) { @@ -726,7 +745,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float *const c_A0 = A0; const gray_image c_trans_map_filtered = trans_map_filtered; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(c_A0, c_trans_map_filtered, img_in, img_out, size, t_min) \ + schedule(static) #endif for(size_t i = 0; i < size; i++) { From 2e3f45412bed4337fd2d00ee50e3ab15ab97c4eb Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 20:51:33 +0200 Subject: [PATCH 36/98] iop: Fix building ashift.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/ashift.c | 55 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/iop/ashift.c b/src/iop/ashift.c index 8fb7c78e927e..3cb86f4587c2 100644 --- a/src/iop/ashift.c +++ b/src/iop/ashift.c @@ -883,7 +883,10 @@ int distort_transform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, floa const float cy = fullheight * data->ct; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(points, points_count, homograph) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cx, cy) \ + shared(points, points_count, homograph) \ + schedule(static) #endif for(size_t i = 0; i < points_count * 2; i += 2) { @@ -917,7 +920,10 @@ int distort_backtransform(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float cy = fullheight * data->ct; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(points, points_count, ihomograph) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cx, cy) \ + shared(points, points_count, ihomograph) \ + schedule(static) #endif for(size_t i = 0; i < points_count * 2; i += 2) { @@ -957,7 +963,10 @@ void distort_mask(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *p #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(ihomograph, interpolation) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cx, cy, in, out, roi_in, roi_out) \ + shared(ihomograph, interpolation) \ + schedule(static) #endif // go over all pixels of output image for(int j = 0; j < roi_out->height; j++) @@ -1128,7 +1137,10 @@ static void rgb2grey256(const float *in, double *out, const int width, const int const int ch = 4; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -1155,7 +1167,10 @@ static void edge_enhance_1d(const double *in, double *out, const int width, cons const double *kernel = (dir == ASHIFT_ENHANCE_HORIZONTAL) ? (const double *)hkernel : (const double *)vkernel; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out, kernel) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(in, out, kernel) \ + schedule(static) #endif // loop over image pixels and perform sobel convolution for(int j = khwidth; j < height - khwidth; j++) @@ -1179,7 +1194,10 @@ static void edge_enhance_1d(const double *in, double *out, const int width, cons } #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(out) \ + schedule(static) #endif // border fill in output buffer, so we don't get pseudo lines at image frame for(int j = 0; j < height; j++) @@ -1221,7 +1239,10 @@ static int edge_enhance(const double *in, double *out, const int width, const in // calculate absolute values #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(Gx, Gy, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(Gx, Gy, out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) { @@ -1268,7 +1289,10 @@ static int detail_enhance(const float *in, float *out, const int width, const in // convert RGB input to Lab, use output buffer for intermediate storage #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -1297,7 +1321,10 @@ static int detail_enhance(const float *in, float *out, const int width, const in // convert resulting Lab to RGB output #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(out) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -1317,7 +1344,10 @@ static int detail_enhance(const float *in, float *out, const int width, const in static void gamma_correct(const float *in, float *out, const int width, const int height) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(in, out) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -2901,7 +2931,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(ihomograph, interpolation) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ch_width, cx, cy, ivoid, ovoid, roi_in, roi_out) \ + shared(ihomograph, interpolation) \ + schedule(static) #endif // go over all pixels of output image for(int j = 0; j < roi_out->height; j++) From b0a5d24039af992d6b6142219eb2b414e6e2b46f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:05:35 +0200 Subject: [PATCH 37/98] iop: Fix building globaltonemap.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/globaltonemap.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iop/globaltonemap.c b/src/iop/globaltonemap.c index c0ef68f49089..c204ca813208 100644 --- a/src/iop/globaltonemap.c +++ b/src/iop/globaltonemap.c @@ -143,7 +143,10 @@ static inline void process_reinhard(struct dt_iop_module_t *self, dt_dev_pixelpi const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -220,7 +223,10 @@ static inline void process_drago(struct dt_iop_module_t *self, dt_dev_pixelpipe_ const float bl = logf(fmaxf(eps, data->drago.bias)) / logf(0.5); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, lwmax) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, bl, ldc, roi_out) \ + shared(in, out, lwmax) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -244,7 +250,10 @@ static inline void process_filmic(struct dt_iop_module_t *self, dt_dev_pixelpipe const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 8a865fb00e6d65d75ab0b552ccf8cbee7cfcbb6c Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:12:38 +0200 Subject: [PATCH 38/98] iop: Fix building colorcontrast.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorcontrast.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/iop/colorcontrast.c b/src/iop/colorcontrast.c index 8a10802b44b6..a7b9ffb79b5a 100644 --- a/src/iop/colorcontrast.c +++ b/src/iop/colorcontrast.c @@ -157,7 +157,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const if(d->unbound) { #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -170,7 +172,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else { #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -203,7 +207,11 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // iterate over all output pixels (same coordinates as input) #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, max, min, offset, ovoid, roi_in, roi_out, \ + scale, unbound) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 5a52b1b8a13387d23868aa2740888bcd6e194c85 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:15:41 +0200 Subject: [PATCH 39/98] iop: Fix building colorize.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorize.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/colorize.c b/src/iop/colorize.c index d38cc95d72ef..9dc4aa2d9983 100644 --- a/src/iop/colorize.c +++ b/src/iop/colorize.c @@ -150,7 +150,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float Lmlmix = L - (mix * 100.0f) / 2.0f; #ifdef _OPENMP -#pragma omp parallel for default(none) private(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(a, b, ch, ivoid, Lmlmix, mix, ovoid, roi_out) \ + private(in, out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 65bafe73e91c3f3116a68aff6464bb00abd67225 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:24:24 +0200 Subject: [PATCH 40/98] iop: Fix building nlmeans.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/nlmeans.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/iop/nlmeans.c b/src/iop/nlmeans.c index 3747cfb80f7c..a08cba0c911e 100644 --- a/src/iop/nlmeans.c +++ b/src/iop/nlmeans.c @@ -394,7 +394,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // do this in parallel with a little threading overhead. could parallelize the outer loops with a bit more // memory #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) firstprivate(inited_slide) shared(kj, ki, Sa) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, norm2, ovoid, P, roi_in, roi_out, sharpness) \ + firstprivate(inited_slide) \ + shared(kj, ki, Sa) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -480,7 +484,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const out = ((float *const)ovoid); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, in, invert, out, roi_out, weight) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -532,7 +539,11 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // do this in parallel with a little threading overhead. could parallelize the outer loops with a bit more // memory #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) firstprivate(inited_slide) shared(kj, ki, Sa) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, norm2, ovoid, P, roi_in, roi_out, sharpness) \ + firstprivate(inited_slide) \ + shared(kj, ki, Sa) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -664,7 +675,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 weight = _mm_set_ps(1.0f, d->chroma, d->chroma, d->luma); const __m128 invert = _mm_sub_ps(_mm_set1_ps(1.0f), weight); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(invert, ivoid, ovoid, roi_out, weight) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 060adb5b5059cbcae0f934f83489cb7a18bb9384 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:31:27 +0200 Subject: [PATCH 41/98] iop: Fix building lowlight.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/lowlight.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/lowlight.c b/src/iop/lowlight.c index bc5c4c86679e..43a4da60b1ca 100644 --- a/src/iop/lowlight.c +++ b/src/iop/lowlight.c @@ -136,7 +136,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const dt_Lab_to_XYZ(Lab_sw, XYZ_sw); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d, XYZ_sw) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, o, roi_out) \ + shared(d, XYZ_sw) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From e9074f9d9c4b85200f6143d9162d06029e29a003 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sat, 25 May 2019 21:47:38 +0200 Subject: [PATCH 42/98] iop: Fix building overexposed.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/overexposed.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/overexposed.c b/src/iop/overexposed.c index 8dafeeb764f2..50c238167d13 100644 --- a/src/iop/overexposed.c +++ b/src/iop/overexposed.c @@ -184,7 +184,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const _transform_image_colorspace(self, in, img_tmp, roi_out); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, img_tmp, in, lower, lower_color, out, roi_out, \ + upper, upper_color) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { From aeb8ec97218ab51a701cb4157f808cbf809346a1 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 26 May 2019 10:37:15 +0200 Subject: [PATCH 43/98] iop: Fix building clipping.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/clipping.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/iop/clipping.c b/src/iop/clipping.c index b386d87e37d2..3a1e4968ac9d 100644 --- a/src/iop/clipping.c +++ b/src/iop/clipping.c @@ -535,7 +535,10 @@ void distort_mask(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *p if(!d->flags && d->angle == 0.0 && d->all_off && roi_in->width == roi_out->width && roi_in->height == roi_out->height) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, out, roi_out) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -556,7 +559,10 @@ void distort_mask(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *p keystone_get_matrix(k_space, kxa, kxb, kxc, kxd, kya, kyb, kyc, kyd, &ma, &mb, &md, &me, &mg, &mh); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(d, interpolation, k_space, ma, mb, md, me, mg, mh) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, kxa, kya, out, roi_in, roi_out) \ + shared(d, interpolation, k_space, ma, mb, md, me, mg, mh) \ + schedule(static) #endif // (slow) point-by-point transformation. // TODO: optimize with scanlines and linear steps between? @@ -907,7 +913,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const && roi_in->height == roi_out->height) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, roi_out) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -933,7 +942,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const keystone_get_matrix(k_space, kxa, kxb, kxc, kxd, kya, kyb, kyc, kyd, &ma, &mb, &md, &me, &mg, &mh); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(d, interpolation, k_space, ma, mb, md, me, mg, mh) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ch_width, ivoid, kxa, kya, ovoid, roi_in, roi_out) \ + shared(d, interpolation, k_space, ma, mb, md, me, mg, mh) \ + schedule(static) #endif // (slow) point-by-point transformation. // TODO: optimize with scanlines and linear steps between? From d08f8d3ee0c67a80f140f3f2ecb6b7632278a564 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 26 May 2019 10:50:37 +0200 Subject: [PATCH 44/98] iop: Fix building rawdenoise.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/rawdenoise.c | 48 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/iop/rawdenoise.c b/src/iop/rawdenoise.c index 4d8a89476501..6cbad633ebe9 100644 --- a/src/iop/rawdenoise.c +++ b/src/iop/rawdenoise.c @@ -239,7 +239,10 @@ static void wavelet_denoise(const float *const in, float *const out, const dt_io const int halfheight = roi->height / 2 + (roi->height & (~c) & 1); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(c) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, fimg, roi, size, halfwidth) \ + shared(c) \ + schedule(static) #endif for(int row = c & 1; row < roi->height; row += 2) { @@ -259,7 +262,10 @@ static void wavelet_denoise(const float *const in, float *const out, const dt_io // filter horizontally and transpose #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, halfheight, halfwidth, pass1, pass2) \ + shared(lev) \ + schedule(static) #endif for(int col = 0; col < halfwidth; col++) { @@ -268,7 +274,10 @@ static void wavelet_denoise(const float *const in, float *const out, const dt_io } // filter vertically and transpose back #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, halfheight, halfwidth, pass2, pass3) \ + shared(lev) \ + schedule(static) #endif for(int row = 0; row < halfheight; row++) { @@ -278,7 +287,9 @@ static void wavelet_denoise(const float *const in, float *const out, const dt_io const float thold = threshold * noise[lev]; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, halfheight, halfwidth, pass1, pass3, thold) \ + shared(lev) #endif for(size_t i = 0; i < (size_t)halfwidth * halfheight; i++) { @@ -290,7 +301,10 @@ static void wavelet_denoise(const float *const in, float *const out, const dt_io lastpass = pass3; } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(c, lastpass) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, halfwidth, out, roi) \ + shared(c, lastpass) \ + schedule(static) #endif for(int row = c & 1; row < roi->height; row += 2) { @@ -394,7 +408,10 @@ static void wavelet_denoise_xtrans(const float *const in, float *out, const dt_i memset(fimg, 0, size * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(c) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, height, in, roi, size, width, xtrans) \ + shared(c) \ + schedule(static) #endif for(int row = (c != 1); row < height - 1; row++) { @@ -427,20 +444,28 @@ static void wavelet_denoise_xtrans(const float *const in, float *out, const dt_i // filter horizontally and transpose #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, height, pass1, pass2, width) \ + shared(lev) \ + schedule(static) #endif for(int col = 0; col < width; col++) hat_transform(fimg + pass2 + (size_t)col * height, fimg + pass1 + col, width, height, 1 << lev); // filter vertically and transpose back #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, height, pass2, pass3, width) \ + shared(lev) \ + schedule(static) #endif for(int row = 0; row < height; row++) hat_transform(fimg + pass3 + (size_t)row * width, fimg + pass2 + row, height, width, 1 << lev); const float thold = threshold * noise[lev]; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(lev) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(fimg, pass1, pass3, size, thold) \ + shared(lev) #endif for(size_t i = 0; i < size; i++) { @@ -453,7 +478,10 @@ static void wavelet_denoise_xtrans(const float *const in, float *out, const dt_i } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(c, lastpass, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, fimg, roi, width, xtrans) \ + shared(c, lastpass, out) \ + schedule(static) #endif for(int row = 0; row < height; row++) { From 62718e2f7aac5d2bcc5a4aad4e697de6d1862092 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Sun, 26 May 2019 10:52:32 +0200 Subject: [PATCH 45/98] iop: Fix building colorchecker.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorchecker.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/colorchecker.c b/src/iop/colorchecker.c index bea17752d00f..1d500199ea7e 100644 --- a/src/iop/colorchecker.c +++ b/src/iop/colorchecker.c @@ -449,7 +449,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const dt_iop_colorchecker_data_t *const data = (dt_iop_colorchecker_data_t *)piece->data; const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) collapse(2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, data, ivoid, ovoid, roi_in, roi_out) \ + schedule(static) \ + collapse(2) #endif for(int j=0;jheight;j++) { From 9de4f013feead36b23a68aadc0b9db2034bcbf32 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 13:13:48 +0200 Subject: [PATCH 46/98] iop: Fix building colorzones.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorzones.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/iop/colorzones.c b/src/iop/colorzones.c index 5401140abbdd..d523bfa9a1d0 100644 --- a/src/iop/colorzones.c +++ b/src/iop/colorzones.c @@ -329,7 +329,10 @@ void process_v3(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, con dt_iop_colorzones_data_t *d = (dt_iop_colorzones_data_t *)(piece->data); const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, o, roi_out) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -382,7 +385,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float normalize_C = 1.f / (128.0f * sqrtf(2.f)); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, roi_out) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From e43dcb48a40ed790572d0c37871e5d067cf286b7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 13:21:37 +0200 Subject: [PATCH 47/98] iop: Fix building colorout.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorout.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/iop/colorout.c b/src/iop/colorout.c index 451902cb6d39..c264e21c8a3e 100644 --- a/src/iop/colorout.c +++ b/src/iop/colorout.c @@ -348,7 +348,9 @@ static void process_fastpath_apply_tonecurves(struct dt_iop_module_t *self, dt_d { // apply profile float *const out = (float *const)ovoid; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -363,7 +365,9 @@ static void process_fastpath_apply_tonecurves(struct dt_iop_module_t *self, dt_d { // apply profile float *const out = (float *const)ovoid; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -396,7 +400,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // fprintf(stderr,"Using cmatrix codepath\n"); // convert to rgb using matrix #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(d, ch, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -422,7 +428,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { // fprintf(stderr,"Using xform codepath\n"); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, gamutcheck, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -469,7 +477,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // fprintf(stderr,"Using cmatrix codepath\n"); // convert to rgb using matrix #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_in, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -500,7 +510,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // fprintf(stderr,"Using xform codepath\n"); const __m128 outofgamutpixel = _mm_set_ps(0.0f, 1.0f, 1.0f, 0.0f); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, gamutcheck, outofgamutpixel, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From ccc544d4c0cfd08d90c5a3a79ff7af120307ad97 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 13:25:16 +0200 Subject: [PATCH 48/98] iop: Fix building bilateral.cc with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/bilateral.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/iop/bilateral.cc b/src/iop/bilateral.cc index bbfa50e7b4bf..f213b396ea5f 100644 --- a/src/iop/bilateral.cc +++ b/src/iop/bilateral.cc @@ -148,7 +148,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const weights_buf = (float *)malloc(weights_size * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(m, mat, isig2col) private(in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, rad, roi_in, roi_out, wd, weights_buf) \ + shared(m, mat, isig2col) \ + private(in, out) \ + schedule(static) #endif for(int j = rad; j < roi_out->height - rad; j++) { From 675acdb132249928c33c78428921727985e93616 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 13:51:39 +0200 Subject: [PATCH 49/98] iop: Fix building colorbalance.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorbalance.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/iop/colorbalance.c b/src/iop/colorbalance.c index 4dde92e55df8..9054d71a99ab 100644 --- a/src/iop/colorbalance.c +++ b/src/iop/colorbalance.c @@ -353,7 +353,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const (gamma[2] != 0.0) ? 1.0 / gamma[2] : 1000000.0 }; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(d) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, gain, gamma_inv, lift, ivoid, ovoid, roi_in, \ + roi_out) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { @@ -400,7 +404,12 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const (gamma[2] != 0.0) ? 1.0 / gamma[2] : 1000000.0 }; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(d) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, contrast, gain, gamma_inv, grey, ivoid, lift, \ + ovoid, roi_in, roi_out, run_contrast, \ + run_saturation, run_saturation_out) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { @@ -464,7 +473,12 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const (2.0f - d->gamma[CHANNEL_BLUE]) * (2.0f - d->gamma[CHANNEL_FACTOR])}; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(d) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, contrast, gain, gamma, grey, ivoid, lift, ovoid, \ + roi_in, roi_out, run_contrast, run_saturation, \ + run_saturation_out) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { @@ -562,7 +576,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c 0.0f); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, gain, gamma_inv, ivoid, lift, one, ovoid, roi_in, roi_out, zero) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { @@ -610,7 +626,13 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 gamma_inv_RGB = _mm_set1_ps(1.0f/2.2f); #ifdef _OPENMP -#pragma omp parallel for SIMD()default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, contrast, gain, gamma_inv, gamma_inv_RGB, \ + gamma_RGB, grey, ivoid, lift, one, ovoid, roi_in, \ + roi_out, run_contrast, run_saturation, \ + run_saturation_out, saturation, saturation_out, \ + zero) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { @@ -678,7 +700,12 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c 0.0f); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, contrast, gain, gamma, grey, ivoid, lift, ovoid, \ + roi_in, roi_out, run_contrast, run_saturation, \ + run_saturation_out, saturation, saturation_out, \ + zero) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_in->width * roi_out->height; k += ch) { From b3c4e075f0c0245a7d2c1b0fb70c88df24699112 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 17:49:50 +0200 Subject: [PATCH 50/98] iop: Fix building equalizer_eaw.h with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/equalizer_eaw.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/iop/equalizer_eaw.h b/src/iop/equalizer_eaw.h index 1d58e244b173..e2afc511b60b 100644 --- a/src/iop/equalizer_eaw.h +++ b/src/iop/equalizer_eaw.h @@ -43,7 +43,11 @@ static void dt_iop_equalizer_wtf(float *buf, float **weight_a, const int l, cons float *const tmp_width_buf = (float *)malloc(width * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(weight_a, buf) private(ch) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, l, st, step, tmp_width_buf, wd, width) \ + shared(weight_a, buf) \ + private(ch) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -73,7 +77,11 @@ static void dt_iop_equalizer_wtf(float *buf, float **weight_a, const int l, cons float *const tmp_height_buf = (float *)malloc(height * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(weight_a, buf) private(ch) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, l, st, step, tmp_height_buf, wd, width) \ + shared(weight_a, buf) \ + private(ch) \ + schedule(static) #endif for(int i = 0; i < width; i++) { @@ -110,7 +118,10 @@ static void dt_iop_equalizer_iwtf(float *buf, float **weight_a, const int l, con float *const tmp_height_buf = (float *)malloc(height * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(weight_a, buf) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, l, st, step, tmp_height_buf, wd, width) \ + shared(weight_a, buf) \ + schedule(static) #endif for(int i = 0; i < width; i++) { @@ -139,7 +150,10 @@ static void dt_iop_equalizer_iwtf(float *buf, float **weight_a, const int l, con float *const tmp_width_buf = (float *)malloc(width * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(weight_a, buf) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, l, st, step, tmp_width_buf, wd, width) \ + shared(weight_a, buf) \ + schedule(static) #endif for(int j = 0; j < height; j++) { From 3bc6a2ba204b0559e879c8f74bf2b8265bbbbe29 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 17:52:09 +0200 Subject: [PATCH 51/98] iop: Fix building rotatepixels.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/rotatepixels.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/rotatepixels.c b/src/iop/rotatepixels.c index 5ac53596cea2..b445bdee0d13 100644 --- a/src/iop/rotatepixels.c +++ b/src/iop/rotatepixels.c @@ -269,7 +269,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c const struct dt_interpolation *interpolation = dt_interpolation_new(DT_INTERPOLATION_USERPREF); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(piece, interpolation) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ch_width, ivoid, ovoid, roi_in, roi_out, scale) \ + shared(piece, interpolation) \ + schedule(static) #endif // (slow) point-by-point transformation. // TODO: optimize with scanlines and linear steps between? From 636f39add54902c9a30c77d033af7442c015b8a3 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 17:56:42 +0200 Subject: [PATCH 52/98] iop: Fix building rgbcurve.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/rgbcurve.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/iop/rgbcurve.c b/src/iop/rgbcurve.c index bf38cb1007ac..b6976f89a0cf 100644 --- a/src/iop/rgbcurve.c +++ b/src/iop/rgbcurve.c @@ -1955,7 +1955,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int autoscale = d->params.curve_autoscale; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(autoscale, ch, height, ivoid, ovoid, work_profile, xm_b, \ + xm_g, xm_L, width) \ + shared(d) \ + schedule(static) #endif for(int y = 0; y < height; y++) { From 344451d44bbf74e7fca74edc540d674f68c8597f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 17:58:09 +0200 Subject: [PATCH 53/98] iop: Fix building vibrance.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/vibrance.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/vibrance.c b/src/iop/vibrance.c index 92c14b8898d1..b4b42f537144 100644 --- a/src/iop/vibrance.c +++ b/src/iop/vibrance.c @@ -105,7 +105,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float amount = (d->amount * 0.01); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(amount, ch, roi_out) \ + shared(in, out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 9f53a33157c6d1efd91fafb0c8be4082b77bee10 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 28 May 2019 18:02:38 +0200 Subject: [PATCH 54/98] iop: Fix building colorreconstruction.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorreconstruction.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/iop/colorreconstruction.c b/src/iop/colorreconstruction.c index fd773c7ce7e3..162ef1dac67f 100644 --- a/src/iop/colorreconstruction.c +++ b/src/iop/colorreconstruction.c @@ -370,7 +370,9 @@ static void dt_iop_colorreconstruct_bilateral_splat(dt_iop_colorreconstruct_bila // splat into downsampled grid #ifdef _OPENMP -#pragma omp parallel for default(none) shared(b, precedence, params) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, threshold) \ + shared(b, precedence, params) #endif for(int j = 0; j < b->height; j++) { @@ -444,7 +446,9 @@ static void blur_line(dt_iop_colorreconstruct_Lab_t *buf, const int offset1, con const float w1 = 4.f / 16.f; const float w2 = 1.f / 16.f; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(buf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(offset1, offset2, offset3, size1, size2, size3) \ + shared(buf) #endif for(int k = 0; k < size1; k++) { @@ -520,7 +524,8 @@ static void dt_iop_colorreconstruct_bilateral_slice(const dt_iop_colorreconstruc const int oy = b->size_x; const int oz = b->size_y * b->size_x; #ifdef _OPENMP -#pragma omp parallel for default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(b, in, out, oy, oz, rescale, roi, threshold) #endif for(int j = 0; j < roi->height; j++) { From 73ad2d630743e8cef57dfa2dd96b06e59fe03cc7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 08:42:09 +0200 Subject: [PATCH 55/98] iop: Fix building bloom.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/bloom.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/iop/bloom.c b/src/iop/bloom.c index 32e7129841cb..e90da1d99e7f 100644 --- a/src/iop/bloom.c +++ b/src/iop/bloom.c @@ -130,7 +130,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const /* get the thresholded lights into buffer */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data, blurlightness) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, roi_out, scale) \ + shared(data, blurlightness) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -150,7 +153,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const for(int iteration = 0; iteration < BOX_ITERATIONS; iteration++) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(blurlightness) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(hr, roi_out, scanline_buf, size) \ + shared(blurlightness) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -184,7 +190,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const #ifdef _OPENMP -#pragma omp parallel for default(none) shared(blurlightness) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(hr, npoffs, opoffs, roi_out, size, scanline_buf) \ + shared(blurlightness) \ + schedule(static) #endif for(int x = 0; x < roi_out->width; x++) { @@ -218,7 +227,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const /* screen blend lightness with original */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data, blurlightness) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out) \ + shared(in, out, data, blurlightness) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 96202c5bb5bc0c75df0830c03a13944bc4550bfd Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 10:22:11 +0200 Subject: [PATCH 56/98] iop: Fix building rawprepare.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/rawprepare.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/iop/rawprepare.c b/src/iop/rawprepare.c index 4c6be57ad077..3e3066b73137 100644 --- a/src/iop/rawprepare.c +++ b/src/iop/rawprepare.c @@ -313,7 +313,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const out = (float *const)ovoid; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(csx, csy, d, in, out, roi_in, roi_out) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -337,7 +340,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const out = (float *const)ovoid; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(csx, csy, d, in, out, roi_in, roi_out) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -365,7 +371,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(3) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, csx, csy, div, in, out, roi_in, roi_out, sub) \ + schedule(static) collapse(3) #endif for(int j = 0; j < roi_out->height; j++) { @@ -399,7 +407,9 @@ void process_sse2(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const vo if(piece->pipe->dsc.filters && piece->dsc_in.channels == 1 && piece->dsc_in.datatype == TYPE_UINT16) { // raw mosaic #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(csx, csy, d, ivoid, ovoid, roi_in, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -458,7 +468,9 @@ void process_sse2(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const vo else if(piece->pipe->dsc.filters && piece->dsc_in.channels == 1 && piece->dsc_in.datatype == TYPE_FLOAT) { // raw mosaic, fp, unnormalized #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(d, csx, csy, ivoid, ovoid, roi_in, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -510,7 +522,9 @@ void process_sse2(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const vo const __m128 sub = _mm_load_ps(d->sub), div = _mm_load_ps(d->div); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(csx, csy, div, ivoid, ovoid, roi_in, roi_out, sub) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 0b49d43e67380a5f95f6bf5f8978a440cf114c62 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 10:29:47 +0200 Subject: [PATCH 57/98] iop: Fix building filmic.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/filmic.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/iop/filmic.c b/src/iop/filmic.c index 65dbd96c5d2a..e1b5a2f2416f 100644 --- a/src/iop/filmic.c +++ b/src/iop/filmic.c @@ -433,7 +433,9 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c const float saturation = data->global_saturation / 100.0f; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, data, desaturate, ivoid, ovoid, preserve_color, roi_out, saturation) \ + schedule(static) #endif for(size_t k = 0; k < roi_out->height * roi_out->width * ch; k += ch) { @@ -558,7 +560,12 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 one = _mm_set1_ps(1.0f); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(black, black_sse, ch, data, desaturate, dynamic_range, \ + dynamic_range_sse, EPS, grey, grey_sse, ivoid, one, \ + ovoid, power, preserve_color, roi_out, saturation_sse, \ + zero) \ + schedule(static) #endif for(size_t k = 0; k < roi_out->height * roi_out->width * ch; k += ch) { @@ -1407,7 +1414,10 @@ void commit_params(dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_ const float sigma = saturation * saturation * latitude * latitude; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(d) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(center, sigma) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 65536; k++) { From 867ddaf985ffcfcfd90dfe11f99777e5ec164245 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 10:32:54 +0200 Subject: [PATCH 58/98] iop: Fix building monochrome.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/monochrome.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/iop/monochrome.c b/src/iop/monochrome.c index d95b35649550..248062cbdab2 100644 --- a/src/iop/monochrome.c +++ b/src/iop/monochrome.c @@ -159,7 +159,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float sigma2 = (d->size * 128.0) * (d->size * 128.0f); // first pass: evaluate color filter: #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(i, o, roi_out, sigma2) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -186,7 +189,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const dt_bilateral_free(b); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(i, o, roi_out) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 35541f85ec60456795e35984faa56bbafe8a8ad2 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 10:46:21 +0200 Subject: [PATCH 59/98] iop: Fix building colorin.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colorin.c | 50 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/iop/colorin.c b/src/iop/colorin.c index bc35e52f1edb..dcb0715cf40e 100644 --- a/src/iop/colorin.c +++ b/src/iop/colorin.c @@ -637,7 +637,9 @@ static void process_cmatrix_bm(struct dt_iop_module_t *self, dt_dev_pixelpipe_io // fprintf(stderr, "Using cmatrix codepath\n"); // only color matrix. use our optimized fast path! #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, clipping, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -716,7 +718,9 @@ static void process_cmatrix_fastpath_simple(struct dt_iop_module_t *self, dt_dev // fprintf(stderr, "Using cmatrix codepath\n"); // only color matrix. use our optimized fast path! #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -748,7 +752,9 @@ static void process_cmatrix_fastpath_clipping(struct dt_iop_module_t *self, dt_d // fprintf(stderr, "Using cmatrix codepath\n"); // only color matrix. use our optimized fast path! #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -813,7 +819,9 @@ static void process_cmatrix_proper(struct dt_iop_module_t *self, dt_dev_pixelpip // fprintf(stderr, "Using cmatrix codepath\n"); // only color matrix. use our optimized fast path! #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, clipping, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -909,7 +917,9 @@ static void process_lcms2_bm(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_ // use general lcms2 fallback #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -954,7 +964,9 @@ static void process_lcms2_proper(struct dt_iop_module_t *self, dt_dev_pixelpipe_ // use general lcms2 fallback #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -1040,7 +1052,10 @@ static void process_sse2_cmatrix_bm(struct dt_iop_module_t *self, dt_dev_pixelpi float *in = (float *)ivoid; float *out = (float *)ovoid; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out, in) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, clipping, cmat, d, lmat, nmat, roi_in, roi_out) \ + shared(out, in) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -1112,7 +1127,9 @@ static void process_sse2_cmatrix_fastpath_simple(struct dt_iop_module_t *self, d const __m128 cm2 = _mm_set_ps(0.0f, cmat[8], cmat[5], cmat[2]); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, cm0, cm1, cm2, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -1150,7 +1167,9 @@ static void process_sse2_cmatrix_fastpath_clipping(struct dt_iop_module_t *self, const __m128 lm2 = _mm_set_ps(0.0f, lmat[8], lmat[5], lmat[2]); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, lm0, lm1, lm2, nm0, nm1, nm2, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -1203,7 +1222,10 @@ static void process_sse2_cmatrix_proper(struct dt_iop_module_t *self, dt_dev_pix float *in = (float *)ivoid; float *out = (float *)ovoid; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out, in) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, clipping, cmat, d, lmat, nmat, roi_in, roi_out) \ + shared(out, in) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -1287,7 +1309,9 @@ static void process_sse2_lcms2_bm(struct dt_iop_module_t *self, dt_dev_pixelpipe // use general lcms2 fallback #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -1335,7 +1359,9 @@ static void process_sse2_lcms2_proper(struct dt_iop_module_t *self, dt_dev_pixel // use general lcms2 fallback #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 0a866fb1aab73c47c5efc2f410291c270da4f667 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 11:05:32 +0200 Subject: [PATCH 60/98] iop: Fix building basecurve.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/basecurve.c | 48 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/iop/basecurve.c b/src/iop/basecurve.c index fc04d63d2c64..b2340b60abdf 100644 --- a/src/iop/basecurve.c +++ b/src/iop/basecurve.c @@ -829,7 +829,9 @@ static inline void apply_ev_and_curve( const float *const unbounded_coeffs) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, in, mul, out, table, unbounded_coeffs, width) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) { @@ -858,7 +860,10 @@ static inline void compute_features( // 2) saturation // 3) local contrast (handled in laplacian form later) #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) collapse(2) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(col, ht, wd) \ + schedule(static) \ + collapse(2) #endif for(int j=0;jdata); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 885fb74f7e606e357134ba2b9b6369e9a7ec9093 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 13:56:43 +0200 Subject: [PATCH 61/98] iop: Fix building basicadj.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/basicadj.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/iop/basicadj.c b/src/iop/basicadj.c index aa8041c9fefe..cc4fb5580e15 100644 --- a/src/iop/basicadj.c +++ b/src/iop/basicadj.c @@ -1633,7 +1633,14 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const size_t stride = (size_t)roi_out->height * roi_out->width * ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(black_point, ch, contrast, gamma, hlcomp, hlrange, in, \ + inv_middle_grey, middle_grey, out, plain_contrast, \ + preserve_colors, process_hlcompr, process_gamma, \ + process_saturation, saturation, scale, stride, \ + work_profile) \ + shared(d) \ + schedule(static) #endif for(size_t k = 0; k < stride; k += ch) { From 251a688814392dbe59dac23041d4f3872b1f5861 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 May 2019 14:03:19 +0200 Subject: [PATCH 62/98] iop: Fix building shadhi.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/shadhi.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/iop/shadhi.c b/src/iop/shadhi.c index 19fe968920c3..de281e719a0e 100644 --- a/src/iop/shadhi.c +++ b/src/iop/shadhi.c @@ -377,7 +377,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // invert and desaturate #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(roi_out) \ + shared(out) \ + schedule(static) #endif for(size_t j = 0; j < (size_t)roi_out->width * roi_out->height * 4; j += 4) { @@ -395,7 +398,13 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, compress, doublemax, flags, halfmax, height, \ + highlights, highlights_ccorrect, lmax, lmin, \ + low_approximation, max, min, shadows, \ + shadows_ccorrect, unbound_mask, whitepoint, width) \ + shared(in, out) \ + schedule(static) #endif for(size_t j = 0; j < (size_t)width * height * ch; j += ch) { From e27feb87919ad96e9c8d26872d6034e96b3650df Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 06:55:40 +0200 Subject: [PATCH 63/98] iop: Fix building sharpen.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/sharpen.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/iop/sharpen.c b/src/iop/sharpen.c index 8fa151fb21c0..edcb6b4f3409 100644 --- a/src/iop/sharpen.c +++ b/src/iop/sharpen.c @@ -323,7 +323,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // gauss blur the image horizontally #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, mat, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -363,7 +365,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // gauss blur the image vertically #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, mat, ovoid, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = rad; j < roi_out->height - wd4 * 4 + rad; j++) { @@ -390,7 +394,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const } } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, mat, ovoid, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = roi_out->height - wd4 * 4 + rad; j < roi_out->height - rad; j++) { @@ -423,7 +429,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const dt_free_align(tmp); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, rad, roi_out) \ + schedule(static) #endif for(int j = rad; j < roi_out->height - rad; j++) { @@ -434,7 +442,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, data, ivoid, ovoid, roi_out) \ + schedule(static) #endif // subtract blurred image, if diff > thrs, add *amount to original image for(int j = 0; j < roi_out->height; j++) @@ -507,7 +517,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // gauss blur the image horizontally #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, mat, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -548,7 +560,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c // gauss blur the image vertically #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, mat, ovoid, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = rad; j < roi_out->height - wd4 * 4 + rad; j++) { @@ -576,7 +590,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c } } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, mat, ovoid, rad, roi_in, roi_out, tmp, wd4) \ + schedule(static) #endif for(int j = roi_out->height - wd4 * 4 + rad; j < roi_out->height - rad; j++) { @@ -611,7 +627,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c dt_free_align(tmp); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, rad, roi_out) \ + schedule(static) #endif for(int j = rad; j < roi_out->height - rad; j++) { @@ -622,7 +640,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, roi_out) \ + shared(data) \ + schedule(static) #endif // subtract blurred image, if diff > thrs, add *amount to original image for(int j = 0; j < roi_out->height; j++) From 7eee582a84477ca2fbd4a92ee713402a31758c3e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 06:58:18 +0200 Subject: [PATCH 64/98] iop: Fix building highpass.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/highpass.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/iop/highpass.c b/src/iop/highpass.c index 1af88ee9a01e..47103cd5b802 100644 --- a/src/iop/highpass.c +++ b/src/iop/highpass.c @@ -292,7 +292,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const /* create inverted image and then blur */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out) \ + shared(in, out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) out[ch * k] = 100.0f - LCLIP(in[ch * k]); // only L in Lab space @@ -369,7 +372,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float contrast_scale = ((data->contrast / 100.0) * 7.5); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, contrast_scale, roi_out) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 879f5b53b50fd00d54ece584dd6c4cffe4c513e4 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 07:07:19 +0200 Subject: [PATCH 65/98] iop: Fix building invert.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/invert.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/iop/invert.c b/src/iop/invert.c index ddb12a0e3da0..b4b47bbaab79 100644 --- a/src/iop/invert.c +++ b/src/iop/invert.c @@ -232,7 +232,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const if(filters == 9u) { // xtrans float mosaiced #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(film_rgb_f, in, out, roi_out, xtrans) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -249,7 +252,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { // bayer float mosaiced #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(film_rgb_f, filters, in, out, roi_out) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -267,7 +273,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -308,7 +317,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 val_max = _mm_set1_ps(1.0f); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(film_rgb_f, ivoid, ovoid, roi_out, val_max, val_min, xtrans) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -363,7 +374,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 val_max = _mm_set1_ps(1.0f); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(film_rgb_f, filters, ivoid, ovoid, roi_out, val_max, val_min) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -405,7 +418,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 film = _mm_set_ps(1.0f, d->color[2], d->color[1], d->color[0]); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, film, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 14e085709fa96b1beb5870ae10e66332148051b4 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 07:11:37 +0200 Subject: [PATCH 66/98] iop: Fix building gamma.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/gamma.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/iop/gamma.c b/src/iop/gamma.c index 3ee2429bbd14..d7160377451a 100644 --- a/src/iop/gamma.c +++ b/src/iop/gamma.c @@ -204,7 +204,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { const float yellow[3] = { 1.0f, 1.0f, 0.0f }; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, mask_display, o, roi_out, yellow) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -227,7 +229,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { const float yellow[3] = { 1.0f, 1.0f, 0.0f }; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, mask_display, o, roi_out, yellow) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -248,7 +252,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { const float yellow[3] = { 1.0f, 1.0f, 0.0f }; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, o, roi_out, yellow) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -269,7 +275,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, i, o, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 5dd8df169fe4050a9daf09f48e120cf5e7d25aef Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 07:15:25 +0200 Subject: [PATCH 67/98] iop: Fix building defringe.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/defringe.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/iop/defringe.c b/src/iop/defringe.c index 3790d310ddf7..015a29086344 100644 --- a/src/iop/defringe.c +++ b/src/iop/defringe.c @@ -254,8 +254,11 @@ void process(struct dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, cons } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(width, height, \ - d) reduction(+ : avg_edge_chroma) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in, out) \ + shared(width, height, d) \ + reduction(+ : avg_edge_chroma) \ + schedule(static) #endif for(int v = 0; v < height; v++) { @@ -291,8 +294,11 @@ void process(struct dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, cons #ifdef _OPENMP // dynamically/guided scheduled due to possible uneven edge-chroma distribution (thanks to rawtherapee code // for this hint!) -#pragma omp parallel for default(none) shared(width, height, d, xy_small, xy_avg, xy_artifact) \ - firstprivate(thresh, avg_edge_chroma) schedule(guided, 32) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in, out, samples_avg, samples_small) \ + shared(width, height, d, xy_small, xy_avg, xy_artifact) \ + firstprivate(thresh, avg_edge_chroma) \ + schedule(guided, 32) #endif for(int v = 0; v < height; v++) { From 33100b597f367da1d0828b6b0ffeb26ddbc1df4b Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 07:29:20 +0200 Subject: [PATCH 68/98] iop: Fix building atrous.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/atrous.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/iop/atrous.c b/src/iop/atrous.c index c38de6b3d2b6..cd467f3eb413 100644 --- a/src/iop/atrous.c +++ b/src/iop/atrous.c @@ -328,7 +328,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const /* The first "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = 0; j < 2 * mult; j++) { @@ -349,7 +351,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = 2 * mult; j < height - 2 * mult; j++) { @@ -406,7 +410,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const /* The last "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = height - 2 * mult; j < height; j++) { @@ -443,7 +449,9 @@ static void eaw_decompose_sse2(float *const out, const float *const in, float *c /* The first "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = 0; j < 2 * mult; j++) { @@ -464,7 +472,9 @@ static void eaw_decompose_sse2(float *const out, const float *const in, float *c } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = 2 * mult; j < height - 2 * mult; j++) { @@ -521,7 +531,9 @@ static void eaw_decompose_sse2(float *const out, const float *const in, float *c /* The last "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, mult, out, sharpen, width) \ + schedule(static) #endif for(int j = height - 2 * mult; j < height; j++) { @@ -562,7 +574,10 @@ static void eaw_synthesize(float *const out, const float *const in, const float const float boost[4] = { boostf[0], boostf[1], boostf[2], boostf[3] }; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(boost, detail, height, in, out, width, threshold) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)4 * width * height; k += 4) { @@ -584,7 +599,9 @@ static void eaw_synthesize_sse2(float *const out, const float *const in, const f const __m128 boost = _mm_set_ps(boostf[3], boostf[2], boostf[1], boostf[0]); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(boost, detail, height, in, out, threshold, width) \ + schedule(static) #endif for(int j = 0; j < height; j++) { From 7766fa462d556f5ab084b0bd0fce6c0319c7a55f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:08:21 +0200 Subject: [PATCH 69/98] iop: Fix building colisa.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colisa.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iop/colisa.c b/src/iop/colisa.c index a5992757f798..326276a01c3c 100644 --- a/src/iop/colisa.c +++ b/src/iop/colisa.c @@ -185,7 +185,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, width) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) { @@ -255,7 +258,10 @@ void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pix const float contrastm1sq = boost * (d->contrast - 1.0f) * (d->contrast - 1.0f); const float contrastscale = sqrt(1.0f + contrastm1sq); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(contrastm1sq, contrastscale) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) { @@ -277,7 +283,10 @@ void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pix const float gamma = (d->brightness >= 0.0f) ? 1.0f / (1.0f + d->brightness) : (1.0f - d->brightness); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(gamma) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) { From 4fb3a27a3b3c3cb117e00a74cced29e7b31b2cf0 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:12:06 +0200 Subject: [PATCH 70/98] iop: Fix building profile_gamma.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/profile_gamma.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/iop/profile_gamma.c b/src/iop/profile_gamma.c index 0bd108686120..a676916fb737 100644 --- a/src/iop/profile_gamma.c +++ b/src/iop/profile_gamma.c @@ -336,7 +336,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c const float noise = powf(2.0f, -16.0f); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(data) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, grey, ivoid, ovoid, roi_out) \ + shared(data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k++) { @@ -359,7 +362,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c case PROFILEGAMMA_GAMMA: { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, ovoid, roi_out) \ + shared(data) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -680,7 +686,10 @@ void commit_params(dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_ if(linear == 0.0) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(gamma) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) d->table[k] = powf(1.00 * k / 0x10000, gamma); } @@ -699,7 +708,10 @@ void commit_params(dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_ c = 1.0; } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d, a, b, c, g) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(linear) \ + shared(d, a, b, c, g) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) { From 2edd90d6ec5ed39d314c2b0f53b1e16ee98ecc87 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:19:37 +0200 Subject: [PATCH 71/98] iop: Fix building rawoverexposed.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/rawoverexposed.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/iop/rawoverexposed.c b/src/iop/rawoverexposed.c index 147cc1ba4524..6abd90de0585 100644 --- a/src/iop/rawoverexposed.c +++ b/src/iop/rawoverexposed.c @@ -193,7 +193,12 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c float *coordbuf = dt_alloc_align(64, coordbufsize * sizeof(float) * dt_get_num_threads()); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(self, coordbuf, buf) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, color, coordbufsize, d, \ + dt_iop_rawoverexposed_colors, filters, iop_order, mode, \ + out, raw, roi_in, roi_out, xtrans) \ + shared(self, coordbuf, buf) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -316,7 +321,10 @@ int process_cl(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_m if(coordbuf == NULL) goto error; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) shared(self, coordbuf, buf) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(height, roi_in, roi_out, width) \ + shared(self, coordbuf, buf) \ + schedule(static) #endif for(int j = 0; j < height; j++) { From d8ad307282b7c17048d33e483872360f3fe6c3fe Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:33:00 +0200 Subject: [PATCH 72/98] iop: Fix building soften.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/soften.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/iop/soften.c b/src/iop/soften.c index 6c5fbd349f19..8dc95d6d67aa 100644 --- a/src/iop/soften.c +++ b/src/iop/soften.c @@ -133,7 +133,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const /* create overexpose image and then blur */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(brightness, ch, in, out, roi_out, saturation) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -158,7 +160,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const for(int iteration = 0; iteration < BOX_ITERATIONS; iteration++) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, radius, out, roi_out, scanline_buf, scanline_size) \ + schedule(static) #endif /* horizontal blur out into out */ for(int y = 0; y < roi_out->height; y++) @@ -210,7 +214,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int opoffs = -(radius + 1) * roi_out->width; const int npoffs = (radius)*roi_out->width; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, npoffs, opoffs, radius, out, roi_out, \ + scanline_buf, scanline_size) \ + schedule(static) #endif for(int x = 0; x < roi_out->width; x++) { @@ -266,7 +273,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float amount_1 = (1 - (d->amount) / 100.0); #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(amount, amount_1, ch, in, out, roi_out) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -290,7 +300,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const float saturation = data->saturation / 100.0; /* create overexpose image and then blur */ #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, brightness, roi_out, saturation) \ + shared(in, out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -315,7 +328,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c for(int iteration = 0; iteration < BOX_ITERATIONS; iteration++) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, radius, roi_out, scanline_buf, size) \ + shared(out) \ + schedule(static) #endif /* horizontal blur out into out */ for(int y = 0; y < roi_out->height; y++) @@ -348,7 +364,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const int opoffs = -(radius + 1) * roi_out->width; const int npoffs = (radius)*roi_out->width; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, npoffs, opoffs, radius, roi_out, scanline_buf, size) \ + shared(out) \ + schedule(static) #endif for(int x = 0; x < roi_out->width; x++) { @@ -385,7 +404,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 amount = _mm_set1_ps(data->amount / 100.0); const __m128 amount_1 = _mm_set1_ps(1 - (data->amount) / 100.0); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, amount, amount_1, roi_out) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 1e1251cde66fa998f3d6eb16ede40dc396c5dc5d Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:54:31 +0200 Subject: [PATCH 73/98] iop: Fix building denoiseprofile.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/denoiseprofile.c | 64 +++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/iop/denoiseprofile.c b/src/iop/denoiseprofile.c index 75e7ddceeffd..758bae82b0c9 100644 --- a/src/iop/denoiseprofile.c +++ b/src/iop/denoiseprofile.c @@ -491,7 +491,10 @@ static inline void precondition(const float *const in, float *const buf, const i (b[2] / a[2]) * (b[2] / a[2]) + 3.f / 8.f }; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(a) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buf, ht, in, sigma2_plus_3_8, wd) \ + shared(a) \ + schedule(static) #endif for(int j = 0; j < ht; j++) { @@ -519,7 +522,10 @@ static inline void backtransform(float *const buf, const int wd, const int ht, c (b[2] / a[2]) * (b[2] / a[2]) + 1.f / 8.f }; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(a) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(buf, ht, sigma2_plus_1_8, wd) \ + shared(a) \ + schedule(static) #endif for(int j = 0; j < ht; j++) { @@ -704,7 +710,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const /* The first "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = 0; j < 2 * mult; j++) { @@ -725,7 +733,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = 2 * mult; j < height - 2 * mult; j++) { @@ -782,7 +792,9 @@ static void eaw_decompose(float *const out, const float *const in, float *const /* The last "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = height - 2 * mult; j < height; j++) { @@ -819,7 +831,9 @@ static void eaw_decompose_sse(float *const out, const float *const in, float *co /* The first "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = 0; j < 2 * mult; j++) { @@ -840,7 +854,9 @@ static void eaw_decompose_sse(float *const out, const float *const in, float *co } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = 2 * mult; j < height - 2 * mult; j++) { @@ -897,7 +913,9 @@ static void eaw_decompose_sse(float *const out, const float *const in, float *co /* The last "2*mult" lines use the macro with tests because the 5x5 kernel * requires nearest pixel interpolation for at least a pixel in the sum */ #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(detail, filter, height, in, inv_sigma2, mult, out, width) \ + schedule(static) #endif for(int j = height - 2 * mult; j < height; j++) { @@ -938,7 +956,10 @@ static void eaw_synthesize(float *const out, const float *const in, const float const float boost[4] = { boostf[0], boostf[1], boostf[2], boostf[3] }; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(boost, detail, height, in, out, threshold, width) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)4 * width * height; k += 4) { @@ -960,7 +981,9 @@ static void eaw_synthesize_sse2(float *const out, const float *const in, const f const __m128 boost = _mm_set_ps(boostf[3], boostf[2], boostf[1], boostf[0]); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(boost, detail, height, in, out, threshold, width) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -1278,7 +1301,11 @@ static void process_nlmeans(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t // do this in parallel with a little threading overhead. could parallelize the outer loops with a bit more // memory #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) firstprivate(inited_slide) shared(kj, ki, in, Sa) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(d, ovoid, P, roi_in, roi_out) \ + firstprivate(inited_slide) \ + shared(kj, ki, in, Sa) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -1383,7 +1410,9 @@ static void process_nlmeans(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t // normalize #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -1474,7 +1503,11 @@ static void process_nlmeans_sse(struct dt_iop_module_t *self, dt_dev_pixelpipe_i // do this in parallel with a little threading overhead. could parallelize the outer loops with a bit more // memory #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) firstprivate(inited_slide, d) shared(kj, ki, in, Sa) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ovoid, P, roi_in, roi_out) \ + firstprivate(inited_slide, d) \ + shared(kj, ki, in, Sa) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -1626,7 +1659,10 @@ static void process_nlmeans_sse(struct dt_iop_module_t *self, dt_dev_pixelpipe_i } // normalize #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(d) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ovoid, roi_out) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 3fe52f907ed1cb380fe412a90460278e8c2febd9 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 09:56:23 +0200 Subject: [PATCH 74/98] iop: Fix building spots.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/spots.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/iop/spots.c b/src/iop/spots.c index 04c4df03bff5..c8796d260fe3 100644 --- a/src/iop/spots.c +++ b/src/iop/spots.c @@ -372,7 +372,9 @@ void _process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // we don't modify most of the image: #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in, out, roi_in, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 2f6307d28d3cac0f6dc3caba6101bd620165960f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 12:21:43 +0200 Subject: [PATCH 75/98] iop: Fix building lowpass.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/lowpass.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iop/lowpass.c b/src/iop/lowpass.c index fb455a49c991..79689de32bd0 100644 --- a/src/iop/lowpass.c +++ b/src/iop/lowpass.c @@ -424,7 +424,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float *const Labminf = (float *)&Labmin; const float *const Labmaxf = (float *)&Labmax; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, Labmaxf, Labminf, roi_out) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -533,7 +536,10 @@ void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pix const float contrastm1sq = boost * (fabs(d->contrast) - 1.0f) * (fabs(d->contrast) - 1.0f); const float contrastscale = copysign(sqrt(1.0f + contrastm1sq), d->contrast); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(contrastm1sq, contrastscale) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) { @@ -555,7 +561,10 @@ void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pix const float gamma = (d->brightness >= 0.0f) ? 1.0f / (1.0f + d->brightness) : (1.0f - d->brightness); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(gamma) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < 0x10000; k++) { From 7a110814d98aba7cc4ccd895e1a15669f7cb6295 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 12:32:34 +0200 Subject: [PATCH 76/98] iop: Fix building temperature.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/temperature.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/iop/temperature.c b/src/iop/temperature.c index 3fd8e212251a..ebfca6b861bf 100644 --- a/src/iop/temperature.c +++ b/src/iop/temperature.c @@ -460,7 +460,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const if(filters == 9u) { // xtrans float mosaiced #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(d, in, out, roi_out, xtrans) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -474,7 +477,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else if(filters) { // bayer float mosaiced #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(d, filters, in, out, roi_out) \ + schedule(static) \ + collapse(2) #endif for(int j = 0; j < roi_out->height; j++) { @@ -490,7 +496,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -522,7 +531,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c if(filters == 9u) { // xtrans float mosaiced #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ivoid, ovoid, roi_out, xtrans) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -563,7 +575,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c else if(filters) { // bayer float mosaiced #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(filters, ivoid, ovoid, roi_out) \ + shared(d) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -605,7 +620,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 coeffs = _mm_set_ps(1.0f, d->coeffs[2], d->coeffs[1], d->coeffs[0]); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, coeffs, ivoid, ovoid, roi_out) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From fe42f0247f21842845f196a88b940d99e4db6d56 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 12:35:20 +0200 Subject: [PATCH 77/98] iop: Fix building scalepixels.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/scalepixels.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/scalepixels.c b/src/iop/scalepixels.c index 7b13147c9a6b..d1512525ee63 100644 --- a/src/iop/scalepixels.c +++ b/src/iop/scalepixels.c @@ -197,7 +197,10 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c const dt_iop_scalepixels_data_t * const d = piece->data; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(interpolation) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch_width, d, ivoid, ovoid, roi_in, roi_out) \ + shared(interpolation) \ + schedule(static) #endif // (slow) point-by-point transformation. // TODO: optimize with scanlines and linear steps between? From 1397b06377d6f1e06332d0fa796e65654ee30beb Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 15:31:49 +0200 Subject: [PATCH 78/98] iop: Fix building velvia.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/velvia.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iop/velvia.c b/src/iop/velvia.c index 3c6629b5087a..34b1d368fd60 100644 --- a/src/iop/velvia.c +++ b/src/iop/velvia.c @@ -144,7 +144,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else { #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, data, ivoid, ovoid, roi_out, strength) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -190,7 +192,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c else { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(in, out, data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out, strength) \ + shared(in, out, data) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { From 89ff9cad01c1ab61dad1dc3e08dfe2a268e163c4 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 15:45:01 +0200 Subject: [PATCH 79/98] iop: Fix building vignette.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/vignette.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/iop/vignette.c b/src/iop/vignette.c index e6507c0a5642..73d227d356bd 100644 --- a/src/iop/vignette.c +++ b/src/iop/vignette.c @@ -744,7 +744,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const unsigned int *const tea_states = calloc(2 * dt_get_num_threads(), sizeof(unsigned int)); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data, yscale, xscale, dither) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, dscale, exp1, exp2, fscale, ivoid, ovoid, \ + roi_center_scaled, roi_out, tea_states, unbound) \ + shared(data, yscale, xscale, dither) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From fe2f4a9821d82fc1071066d99cd77dda270215ee Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 15:46:47 +0200 Subject: [PATCH 80/98] iop: Fix building levels.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/levels.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/iop/levels.c b/src/iop/levels.c index 58ffaf4ccabd..19633d044013 100644 --- a/src/iop/levels.c +++ b/src/iop/levels.c @@ -401,7 +401,9 @@ void process(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *c } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 20125c07c9bc7637b228f217317b3eeeafc7c8b8 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 30 May 2019 15:52:58 +0200 Subject: [PATCH 81/98] iop: Fix building liquify.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/liquify.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/iop/liquify.c b/src/iop/liquify.c index fb69d3f17fdf..a915d9e4acb1 100644 --- a/src/iop/liquify.c +++ b/src/iop/liquify.c @@ -1423,7 +1423,9 @@ void distort_mask(struct dt_iop_module_t *self, struct dt_dev_pixelpipe_iop_t *p // 1. copy the whole image (we'll change only a small part of it) #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, out, roi_in, roi_out) \ + schedule(static) #endif for (int i = 0; i < roi_out->height; i++) { @@ -1466,7 +1468,9 @@ void process(struct dt_iop_module_t *module, dt_dev_pixelpipe_iop_t *piece, cons const int width = MIN(roi_in->width, roi_out->width); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, in, out, roi_in, roi_out, width) \ + schedule(static) #endif for (int i = 0; i < height; i++) { From 22703cfd25e48408d6291195aaed5e0a9994fe68 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 09:57:04 +0200 Subject: [PATCH 82/98] iop: Fix building tonecurve.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/tonecurve.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/iop/tonecurve.c b/src/iop/tonecurve.c index a418dc265cac..00ab2d2aa9e1 100644 --- a/src/iop/tonecurve.c +++ b/src/iop/tonecurve.c @@ -316,7 +316,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int unbound_ab = d->unbound_ab; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(d) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(autoscale_ab, ch, height, i, low_approximation, o, \ + xm_al, xm_ar, xm_bl, xm_br, xm_L, unbound_ab, width) \ + shared(d) \ + schedule(static) #endif for(int k = 0; k < height; k++) { From b07ecfedde1ee44c9932ff3bec40af673a918ee6 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 09:58:59 +0200 Subject: [PATCH 83/98] iop: Fix building splittoning.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/splittoning.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/iop/splittoning.c b/src/iop/splittoning.c index eba409b71543..f18617fe0e2d 100644 --- a/src/iop/splittoning.c +++ b/src/iop/splittoning.c @@ -178,7 +178,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float compress = (data->compress / 110.0) / 2.0; // Don't allow 100% compression.. #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data) private(in, out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, compress, ivoid, ovoid, roi_out) \ + shared(data) \ + private(in, out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 47ecf1fe94cd4abf8cfbe7f0bf0d2688fde9d973 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 10:01:12 +0200 Subject: [PATCH 84/98] iop: Fix building relight.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/relight.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/relight.c b/src/iop/relight.c index 62e66851076f..e1456c170183 100644 --- a/src/iop/relight.c +++ b/src/iop/relight.c @@ -134,7 +134,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float c = (data->width / 10.0) / 2.0; // Width #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(b, c, ch, ivoid, ovoid, roi_out) \ + shared(data) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From d5a029e28b58194010d46f4cf533145ef2d18c99 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 10:04:24 +0200 Subject: [PATCH 85/98] iop: Fix building grain.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/grain.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/grain.c b/src/iop/grain.c index 6d2b370b1c4e..92722af7edcd 100644 --- a/src/iop/grain.c +++ b/src/iop/grain.c @@ -481,7 +481,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const float fib1div2 = fib1 / fib2; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data, hash) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, filter, filtermul, ivoid, ovoid, roi_out, strength, \ + wd, zoom) \ + shared(data, hash) #endif for(int j = 0; j < roi_out->height; j++) { From 63363fe3e41add848a5cc0bbe29d932ec49a12c7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 10:10:47 +0200 Subject: [PATCH 86/98] iop: Fix building dither.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/dither.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/iop/dither.c b/src/iop/dither.c index 966352ce17e2..89b361555692 100644 --- a/src/iop/dither.c +++ b/src/iop/dither.c @@ -311,7 +311,9 @@ static void process_floyd_steinberg(struct dt_iop_module_t *self, dt_dev_pixelpi } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, ivoid, ovoid, width) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -476,7 +478,9 @@ static void process_floyd_steinberg_sse2(struct dt_iop_module_t *self, dt_dev_pi } #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, ivoid, ovoid, width) \ + schedule(static) #endif for(int j = 0; j < height; j++) { @@ -605,7 +609,9 @@ static void process_random(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t unsigned int *const tea_states = calloc(2 * dt_get_num_threads(), sizeof(unsigned int)); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, dither, height, ivoid, ovoid, tea_states, width) \ + schedule(static) #endif for(int j = 0; j < height; j++) { From 046d9ebd18d2d67d3fbbbc4c78a850e255e353b7 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 10:20:51 +0200 Subject: [PATCH 87/98] iop: Fix building clahe.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/clahe.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/iop/clahe.c b/src/iop/clahe.c index 1d70020582ad..84df3165fcdf 100644 --- a/src/iop/clahe.c +++ b/src/iop/clahe.c @@ -91,7 +91,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *luminance = (float *)malloc(((size_t)roi_out->width * roi_out->height) * sizeof(float)); // double lsmax=0.0,lsmin=1.0; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(luminance) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ivoid, roi_out) \ + shared(luminance) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -120,7 +123,11 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // CLAHE #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(luminance) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, dest_buf, destbuf_size, ivoid, ovoid, rad, roi_in, \ + roi_out, slope) \ + shared(luminance) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 7a1ad244b007c7c5fbaeec793d4f0ce61b41c8cf Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 10:25:04 +0200 Subject: [PATCH 88/98] iop: Fix building exposure.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/exposure.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/iop/exposure.c b/src/iop/exposure.c index cb7760026446..4be4d003888c 100644 --- a/src/iop/exposure.c +++ b/src/iop/exposure.c @@ -406,7 +406,9 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, i, o, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k++) { @@ -431,7 +433,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const __m128 scalev = _mm_set1_ps(d->scale); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(blackv, ch, i, o, roi_out, scalev) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From d96148b1de2d4137bcd9279af2ae6e2cdf93f4dd Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 11:11:56 +0200 Subject: [PATCH 89/98] iop: Fix building colortransfer.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colortransfer.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iop/colortransfer.c b/src/iop/colortransfer.c index c8675849a326..1043868c8164 100644 --- a/src/iop/colortransfer.c +++ b/src/iop/colortransfer.c @@ -264,7 +264,10 @@ static void kmeans(const float *col, const dt_iop_roi_t *const roi, const int n, for(int k = 0; k < n; k++) cnt[k] = 0; // randomly sample col positions inside roi #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(col, mean_out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cnt, mean, n, roi, samples, var) \ + shared(col, mean_out) \ + schedule(static) #endif for(int s = 0; s < samples; s++) { @@ -362,7 +365,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const int hist[HISTN]; capture_histogram(in, roi_in, hist); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(data, in, out, hist) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, roi_out) \ + shared(data, in, out, hist) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { @@ -389,7 +395,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // for all pixels: find input cluster, transfer to mapped target cluster #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(data, in, out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, mapio, mean, roi_out, var) \ + shared(data, in, out) \ + schedule(static) #endif for(int k = 0; k < roi_out->height; k++) { From 4714272cc4fb731302daab4f762ab5b4256af050 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 11:41:31 +0200 Subject: [PATCH 90/98] iop: Fix building colormapping.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/colormapping.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iop/colormapping.c b/src/iop/colormapping.c index 43c6809d2290..f7c47b1033a0 100644 --- a/src/iop/colormapping.c +++ b/src/iop/colormapping.c @@ -337,7 +337,10 @@ static void kmeans(const float *col, const int width, const int height, const in for(int k = 0; k < n; k++) cnt[k] = 0; // randomly sample col positions inside roi #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(col, mean_out) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(cnt, height, mean, n, samples, var, width) \ + shared(col, mean_out) \ + schedule(static) #endif for(int s = 0; s < samples; s++) { @@ -497,7 +500,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // first get delta L of equalized L minus original image L, scaled to fit into [0 .. 100] #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(data, in, out, equalization) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, width) \ + shared(data, in, out, equalization) \ + schedule(static) #endif for(int k = 0; k < height; k++) { @@ -532,7 +538,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const weight_buf = malloc(data->n * dt_get_num_threads() * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) shared(data, in, out, equalization) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, mapio, var_ratio, weight_buf, width) \ + shared(data, in, out, equalization) \ + schedule(static) #endif for(int k = 0; k < height; k++) { From ba624be2feecfbb5b1d52d52b9f24c09ebf4a83c Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 11:59:36 +0200 Subject: [PATCH 91/98] iop: Fix building highlights.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/highlights.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/iop/highlights.c b/src/iop/highlights.c index 795a7345035d..72e0cb8f9802 100644 --- a/src/iop/highlights.c +++ b/src/iop/highlights.c @@ -530,7 +530,9 @@ static void process_lch_bayer(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *pie const uint32_t filters = piece->pipe->dsc.filters; #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clip, filters, ivoid, ovoid, roi_out) \ + schedule(dynamic) #endif for(int j = 0; j < roi_out->height; j++) { @@ -629,7 +631,9 @@ static void process_lch_xtrans(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *pi const uint8_t(*const xtrans)[6] = (const uint8_t(*const)[6])piece->pipe->dsc.xtrans; #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clip, ivoid, ovoid, roi_in, roi_out, xtrans) \ + schedule(dynamic) #endif for(int j = 0; j < roi_out->height; j++) { @@ -764,7 +768,9 @@ static void process_clip_plain(dt_dev_pixelpipe_iop_t *piece, const void *const if(piece->pipe->dsc.filters) { // raw mosaic #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(clip, in, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)roi_out->width * roi_out->height; k++) { @@ -776,7 +782,9 @@ static void process_clip_plain(dt_dev_pixelpipe_iop_t *piece, const void *const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, clip, in, out, roi_out) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k++) { @@ -797,7 +805,9 @@ static void process_clip_sse2(dt_dev_pixelpipe_iop_t *piece, const void *const i float *const out = (float *)ovoid; float *const in = (float *)ivoid; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clipm, in, n, out) \ + schedule(static) #endif for(size_t j = 0; j < (n & ~3u); j += 4) _mm_stream_ps(out + j, _mm_min_ps(clipm, _mm_load_ps(in + j))); _mm_sfence(); @@ -811,7 +821,9 @@ static void process_clip_sse2(dt_dev_pixelpipe_iop_t *piece, const void *const i const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, clipm, ivoid, ovoid, roi_in, roi_out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -872,7 +884,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const { const uint8_t(*const xtrans)[6] = (const uint8_t(*const)[6])piece->pipe->dsc.xtrans; #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clips, filters, ivoid, ovoid, roi_in, roi_out, \ + xtrans) \ + schedule(dynamic) #endif for(int j = 0; j < roi_out->height; j++) { @@ -880,7 +895,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const interpolate_color_xtrans(ivoid, ovoid, roi_in, roi_out, 0, -1, j, clips, xtrans, 1); } #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clips, filters, ivoid, ovoid, roi_in, roi_out, \ + xtrans) \ + schedule(dynamic) #endif for(int i = 0; i < roi_out->width; i++) { @@ -891,7 +909,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else { #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) shared(data, piece) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clips, filters, ivoid, ovoid, roi_out) \ + shared(data, piece) \ + schedule(dynamic) #endif for(int j = 0; j < roi_out->height; j++) { @@ -901,7 +922,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const // up/down directions #ifdef _OPENMP -#pragma omp parallel for schedule(dynamic) default(none) shared(data, piece) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(clips, filters, ivoid, ovoid, roi_out) \ + shared(data, piece) \ + schedule(dynamic) #endif for(int i = 0; i < roi_out->width; i++) { From cad56cbed0dc9bb6b0b5aab0e198f9e3d8397000 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 12:05:00 +0200 Subject: [PATCH 92/98] iop: Fix building channelmixer.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/channelmixer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/iop/channelmixer.c b/src/iop/channelmixer.c index 20d6341bdd54..caabff48fc51 100644 --- a/src/iop/channelmixer.c +++ b/src/iop/channelmixer.c @@ -159,7 +159,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const const int ch = piece->colors; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(data) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, gray_mix_mode, ivoid, ovoid, roi_out) \ + shared(data) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From 6340aec74e8402f7ab04ca16ac4bb0c58b89ae16 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 12:30:23 +0200 Subject: [PATCH 93/98] iop: Fix building retouch.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/retouch.c | 65 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/src/iop/retouch.c b/src/iop/retouch.c index 5658f77ea0d3..8e7502d8993e 100644 --- a/src/iop/retouch.c +++ b/src/iop/retouch.c @@ -3579,7 +3579,10 @@ static void image_rgb2lab(float *img_src, const int width, const int height, con if(ch == 4 && use_sse) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_src) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, stride) \ + shared(img_src) \ + schedule(static) #endif for(int i = 0; i < stride; i += ch) { @@ -3595,7 +3598,10 @@ static void image_rgb2lab(float *img_src, const int width, const int height, con #endif #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_src) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, stride) \ + shared(img_src) \ + schedule(static) #endif for(int i = 0; i < stride; i += ch) { @@ -3614,7 +3620,10 @@ static void image_lab2rgb(float *img_src, const int width, const int height, con if(ch == 4 && use_sse) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_src) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, stride) \ + shared(img_src) \ + schedule(static) #endif for(int i = 0; i < stride; i += ch) { @@ -3630,7 +3639,10 @@ static void image_lab2rgb(float *img_src, const int width, const int height, con #endif #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_src) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, stride) \ + shared(img_src) \ + schedule(static) #endif for(int i = 0; i < stride; i += ch) { @@ -3652,8 +3664,12 @@ static void rt_process_stats(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_ const dt_iop_order_iccprofile_info_t *const work_profile = dt_ioppr_get_pipe_work_profile_info(piece->pipe); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) reduction(+ : count, l_sum) reduction(max : l_max) \ - reduction(min : l_min) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, img_src, size, work_profile) \ + schedule(static) \ + reduction(+ : count, l_sum) \ + reduction(max : l_max) \ + reduction(min : l_min) #endif for(int i = 0; i < size; i += ch) { @@ -3699,7 +3715,10 @@ static void rt_adjust_levels(dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piec const float in_inv_gamma = pow(10, tmp); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_src) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in_inv_gamma, left, right, size, work_profile) \ + shared(img_src) \ + schedule(static) #endif for(int i = 0; i < size; i += ch) { @@ -3780,7 +3799,10 @@ static void rt_copy_in_to_out(const float *const in, const struct dt_iop_roi_t * const int y_to = MIN(roi_out->height, roi_in->height); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in, out, roi_in, roi_out, rowsize, xoffs, yoffs, \ + y_to) \ + schedule(static) #endif for(int y = 0; y < y_to; y++) { @@ -3823,7 +3845,10 @@ static void rt_build_scaled_mask(float *const mask, dt_iop_roi_t *const roi_mask } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(mask_tmp, roi_mask_scaled) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(mask, roi_in, roi_mask, x_to, y_to) \ + shared(mask_tmp, roi_mask_scaled) \ + schedule(static) #endif for(int yy = roi_mask_scaled->y; yy < y_to; yy++) { @@ -3857,7 +3882,10 @@ static void rt_copy_image_masked(float *const img_src, float *img_dest, dt_iop_r if(ch == 4 && use_sse) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_dest) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, img_src, mask_scaled, opacity, roi_dest, roi_mask_scaled) \ + shared(img_dest) \ + schedule(static) #endif for(int yy = 0; yy < roi_mask_scaled->height; yy++) { @@ -3888,7 +3916,10 @@ static void rt_copy_image_masked(float *const img_src, float *img_dest, dt_iop_r const int ch1 = (ch == 4) ? ch - 1 : ch; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(img_dest) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ch1, img_src, mask_scaled, opacity, roi_dest, roi_mask_scaled) \ + shared(img_dest) \ + schedule(static) #endif for(int yy = 0; yy < roi_mask_scaled->height; yy++) { @@ -3920,7 +3951,9 @@ static void rt_copy_mask_to_alpha(float *const img, dt_iop_roi_t *const roi_img, const float opacity) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, img, mask_scaled, opacity, roi_img, roi_mask_scaled) \ + schedule(static) #endif for(int yy = 0; yy < roi_mask_scaled->height; yy++) { @@ -3950,7 +3983,9 @@ static void retouch_fill_sse(float *const in, dt_iop_roi_t *const roi_in, float const __m128 val_fill = _mm_load_ps(valf4_fill); #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, in, mask_scaled, opacity, roi_in, roi_mask_scaled, val_fill) \ + schedule(static) #endif for(int yy = 0; yy < roi_mask_scaled->height; yy++) { @@ -3988,7 +4023,9 @@ static void retouch_fill(float *const in, dt_iop_roi_t *const roi_in, const int const int ch1 = (ch == 4) ? ch - 1 : ch; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, ch1, fill_color, in, mask_scaled, opacity, roi_in, roi_mask_scaled) \ + schedule(static) #endif for(int yy = 0; yy < roi_mask_scaled->height; yy++) { From 3c60aa2572d413500f7ce28d92755b828a72c193 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 12:40:57 +0200 Subject: [PATCH 94/98] iop: Fix building graduatednd.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/graduatednd.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/iop/graduatednd.c b/src/iop/graduatednd.c index 1c9c0b0170aa..c6fa32cd10af 100644 --- a/src/iop/graduatednd.c +++ b/src/iop/graduatednd.c @@ -752,7 +752,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const if(data->density > 0) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, cosv, data, filter_compression, hh_inv, hw_inv, \ + ivoid, ix, iy, offset, ovoid, roi_out, sinv) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -798,7 +801,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const else { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, cosv, data, filter_compression, hh_inv, hw_inv, \ + ivoid, ix, iy, offset, ovoid, roi_out, sinv) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -877,7 +883,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c if(data->density > 0) { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, cosv, data, filter_compression, hh_inv, hw_inv, \ + ivoid, ix, iy, offset, ovoid, roi_out, sinv) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { @@ -925,7 +934,10 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c else { #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, cosv, data, filter_compression, hh_inv, hw_inv, \ + ivoid, ix, iy, offset, ovoid, roi_out, sinv) \ + schedule(static) #endif for(int y = 0; y < roi_out->height; y++) { From 269c71a1428f8e73ab0008401dcb919bce647426 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 12:49:28 +0200 Subject: [PATCH 95/98] iop: Fix building zonesystem.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/zonesystem.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/iop/zonesystem.c b/src/iop/zonesystem.c index abe198651f2d..7a06032c9c0d 100644 --- a/src/iop/zonesystem.c +++ b/src/iop/zonesystem.c @@ -228,7 +228,10 @@ static void process_common_cleanup(struct dt_iop_module_t *self, dt_dev_pixelpip if(gauss && tmp) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmp) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, width, ivoid) \ + shared(tmp) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) tmp[k] = ((float *)ivoid)[ch * k]; @@ -237,7 +240,10 @@ static void process_common_cleanup(struct dt_iop_module_t *self, dt_dev_pixelpip /* create zonemap preview for input */ dt_pthread_mutex_lock(&g->lock); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmp, g) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, size, width) \ + shared(tmp, g) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) { @@ -247,7 +253,10 @@ static void process_common_cleanup(struct dt_iop_module_t *self, dt_dev_pixelpip #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmp) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, height, ovoid, width) \ + shared(tmp) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) tmp[k] = ((float *)ovoid)[ch * k]; @@ -257,7 +266,10 @@ static void process_common_cleanup(struct dt_iop_module_t *self, dt_dev_pixelpip /* create zonemap preview for output */ dt_pthread_mutex_lock(&g->lock); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(tmp, g) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, size, width) \ + shared(tmp, g) \ + schedule(static) #endif for(size_t k = 0; k < (size_t)width * height; k++) { @@ -285,7 +297,10 @@ void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const float *const out = (float *const)ovoid; #ifdef _OPENMP -#pragma omp parallel for SIMD() default(none) schedule(static) collapse(2) +#pragma omp parallel for SIMD() default(none) \ + dt_omp_firstprivate(ch, d, in, out, roi_out, size) \ + schedule(static) \ + collapse(2) #endif for(size_t k = 0; k < (size_t)ch * roi_out->width * roi_out->height; k += ch) { @@ -315,7 +330,9 @@ void process_sse2(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, c const int size = d->params.size; #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(ch, d, ivoid, ovoid, roi_out, size) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { From cc6ffd68f93ea9c9ab043224cb0127c92b173741 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 13:13:32 +0200 Subject: [PATCH 96/98] iop: Fix building demosaic.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/iop/demosaic.c | 72 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/src/iop/demosaic.c b/src/iop/demosaic.c index 37d73b39a2be..d73a124f92f5 100644 --- a/src/iop/demosaic.c +++ b/src/iop/demosaic.c @@ -328,7 +328,10 @@ static void pre_median_b(float *out, const float *const in, const dt_iop_roi_t * for(int pass = 0; pass < num_passes; pass++) { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(filters, in, lim, roi, threshold) \ + shared(out) \ + schedule(static) #endif for(int row = 3; row < roi->height - 3; row++) { @@ -388,7 +391,10 @@ static void color_smoothing(float *out, const dt_iop_roi_t *const roi_out, const for(int i = 0; i < roi_out->width; i++, outp += 4) outp[3] = outp[c]; } #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(out, c) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(roi_out, width4) \ + shared(out, c) \ + schedule(static) #endif for(int j = 1; j < roi_out->height - 1; j++) { @@ -443,7 +449,10 @@ static void green_equilibration_lavg(float *out, const float *const in, const in memcpy(out, in, height * width * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(out, oi, oj) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, in, thr, width) \ + shared(out, oi, oj) \ + schedule(static) #endif for(size_t j = oj; j < height - 2; j += 2) { @@ -489,7 +498,11 @@ static void green_equilibration_favg(float *out, const float *const in, const in const int g2_offset = oi ? -1 : 1; memcpy(out, in, (size_t)height * width * sizeof(float)); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) reduction(+ : sum1, sum2) shared(oi, oj) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(g2_offset, height, in, width) \ + reduction(+ : sum1, sum2) \ + shared(oi, oj) \ + schedule(static) #endif for(size_t j = oj; j < (height - 1); j += 2) { @@ -506,7 +519,10 @@ static void green_equilibration_favg(float *out, const float *const in, const in return; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(out, oi, oj, gr_ratio) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(g2_offset, height, in, width) \ + shared(out, oi, oj, gr_ratio) \ + schedule(static) #endif for(int j = oj; j < (height - 1); j += 2) { @@ -601,7 +617,10 @@ static void xtrans_markesteijn_interpolate(float *out, const float *const in, // extra passes propagates out errors at edges, hence need more padding const int pad_tile = (passes == 1) ? 12 : 17; #ifdef _OPENMP -#pragma omp parallel for default(none) shared(sgrow, sgcol, allhex, out) schedule(dynamic) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(all_buffers, buffer_size, dir, height, in, ndir, pad_tile, passes, roi_in, width, xtrans) \ + shared(sgrow, sgcol, allhex, out) \ + schedule(dynamic) #endif // step through TSxTS cells of image, each tile overlapping the // prior as interpolation needs a substantial border @@ -1625,7 +1644,11 @@ static void xtrans_fdc_interpolate(struct dt_iop_module_t *self, float *out, con } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(sgrow, sgcol, allhex, out, rowoffset, coloffset, hybrid_fdc) schedule(dynamic) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(all_buffers, dir, directionality, harr, height, in, \ + Minv, modarr, roi_in, width, xtrans) \ + shared(sgrow, sgcol, allhex, out, rowoffset, coloffset, hybrid_fdc) \ + schedule(dynamic) #endif // step through TSxTS cells of image, each tile overlapping the // prior as interpolation needs a substantial border @@ -2132,7 +2155,10 @@ static void lin_interpolate(float *out, const float *const in, const dt_iop_roi_ // border interpolate #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(colors, filters, in, roi_in, roi_out, xtrans) \ + shared(out) \ + schedule(static) #endif for(int row = 0; row < roi_out->height; row++) for(int col = 0; col < roi_out->width; col++) @@ -2206,7 +2232,10 @@ static void lin_interpolate(float *out, const float *const in, const dt_iop_roi_ } #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(colors, in, lookup, roi_in, roi_out, size) \ + shared(out) \ + schedule(static) #endif for(int row = 1; row < roi_out->height - 1; row++) { @@ -2340,7 +2369,11 @@ static void vng_interpolate(float *out, const float *const in, for(int row = 2; row < height - 2; row++) /* Do VNG interpolation */ { #ifdef _OPENMP -#pragma omp parallel for default(none) shared(row, code, brow, out, filters4) private(ip) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(colors, pcol, prow, roi_in, width, xtrans) \ + shared(row, code, brow, out, filters4) \ + private(ip) \ + schedule(static) #endif for(int col = 2; col < width - 2; col++) { @@ -2405,7 +2438,10 @@ static void vng_interpolate(float *out, const float *const in, if(filters != 9 && !FILTERS_ARE_4BAYER(filters)) // x-trans or CYGM/RGBE // for Bayer mix the two greens to make VNG4 #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(out) \ + schedule(static) #endif for(int i = 0; i < height * width; i++) out[i * 4 + 1] = (out[i * 4 + 1] + out[i * 4 + 3]) / 2.0f; } @@ -2419,7 +2455,10 @@ static void passthrough_monochrome(float *out, const float *const in, dt_iop_roi assert(roi_in->height >= roi_out->height); #ifdef _OPENMP -#pragma omp parallel for default(none) shared(out) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(in, roi_out, roi_in) \ + shared(out) \ + schedule(static) #endif for(int j = 0; j < roi_out->height; j++) { @@ -2488,7 +2527,10 @@ static void demosaic_ppg(float *const out, const float *const in, const dt_iop_r } // for all pixels: interpolate green into float array, or copy color. #ifdef _OPENMP -#pragma omp parallel for default(none) shared(input) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(filters, out, roi_in, roi_out) \ + shared(input) \ + schedule(static) #endif for(int j = offy; j < roi_out->height - offY; j++) { @@ -2568,7 +2610,9 @@ static void demosaic_ppg(float *const out, const float *const in, const dt_iop_r // for all pixels: interpolate colors into float array #ifdef _OPENMP -#pragma omp parallel for default(none) schedule(static) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(filters, out, roi_out) \ + schedule(static) #endif for(int j = 1; j < roi_out->height - 1; j++) { From 32e671e36a6e996c6e94a196cf7e85e3e427f149 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 13:23:49 +0200 Subject: [PATCH 97/98] chart: Fix building main.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/chart/main.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/chart/main.c b/src/chart/main.c index f4915f86ae92..66e200f4f314 100644 --- a/src/chart/main.c +++ b/src/chart/main.c @@ -1426,10 +1426,13 @@ static void get_xyz_sample_from_image(const image_t *const image, float shrink, double sample_x = 0.0, sample_y = 0.0, sample_z = 0.0; size_t n_samples = 0; #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) \ - shared(corners, x_start, y_start, x_end, y_end, delta_x_top, delta_y_top, delta_x_bottom, delta_y_bottom, \ - delta_x_left, delta_y_left, delta_x_right, \ - delta_y_right) reduction(+ : n_samples, sample_x, sample_y, sample_z) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(image) \ + shared(corners, x_start, y_start, x_end, y_end, delta_x_top, delta_y_top, \ + delta_x_bottom, delta_y_bottom, delta_x_left, delta_y_left, \ + delta_x_right, delta_y_right) \ + reduction(+ : n_samples, sample_x, sample_y, sample_z) \ + schedule(static) #endif for(int y = y_start; y < y_end; y++) for(int x = x_start; x < x_end; x++) @@ -1544,7 +1547,10 @@ static void free_image(image_t *image) static void image_lab_to_xyz(float *image, const int width, const int height) { #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(image) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, width) \ + shared(image) \ + schedule(static) #endif for(int y = 0; y < height; y++) for(int x = 0; x < width; x++) From c375fc081a3627ca0bbd8bd21ac99f79c60ba333 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 May 2019 13:25:18 +0200 Subject: [PATCH 98/98] chart: Fix building dtcairo.c with OpenMP and GCC9 Signed-off-by: Andreas Schneider --- src/chart/dtcairo.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/chart/dtcairo.c b/src/chart/dtcairo.c index bd07d3d97bc6..66e32ab17d74 100644 --- a/src/chart/dtcairo.c +++ b/src/chart/dtcairo.c @@ -187,7 +187,10 @@ cairo_surface_t *cairo_surface_create_from_xyz_data(const float *const image, co unsigned char *rgbbuf = (unsigned char *)malloc(sizeof(unsigned char) * height * width * 4); #ifdef _OPENMP -#pragma omp parallel for schedule(static) default(none) shared(rgbbuf) +#pragma omp parallel for default(none) \ + dt_omp_firstprivate(height, image, width) \ + shared(rgbbuf) \ + schedule(static) #endif for(int y = 0; y < height; y++) {