Компилятор для одновременного использования OpenCV и OpenMP 4.5.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Компилятор для одновременного использования OpenCV и OpenMP 4.5.

Сообщение Anonymous »

Я застрял в очень глупом бесконечном цикле и не знаю, как из него выбраться.
Для школьного проекта мне нужно написать простой параллельный код на C++, научитесь использовать OpenMP. Поскольку это связано с изображениями, мне также нужно использовать библиотеку opencv.
Сначала я следовал этому руководству, чтобы вручную собрать библиотеку с помощью mingw, но у меня не получилось заставить ее работать, поэтому я использовал шоколадный скачать библиотеку и она работает без проблем, но только на компиляторе Visual Studio (cl.exe).
У меня нет проблем с последовательной версией, но однажды я перехожу на параллельную , поскольку мне нужно выполнить сокращение массива, я получаю следующую ошибку:

ошибка Переменная C3031 в предложении «сокращение» должна иметь скалярный арифметический тип

Насколько я понял, сокращение массива должно быть доступно в omp версии 4.5 и выше, но компилятор Visual Studio поддерживает только omp до 2.0
Для лучшего понимания это мой CMake

Код: Выделить всё

cmake_minimum_required(VERSION 3.29)
project(LocalBinaryPattern_omp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp:experimental") #visualstudio
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") #mingw

set(CMAKE_CXX_STANDARD 23)
set(ENV{OPENCV_DIR} "C:\\tools\\opencv\\build")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(OpenMP REQUIRED)
#target_link_libraries(LocalBinaryPattern_omp PRIVATE OpenMP::OpenMP_CXX)

add_executable(LocalBinaryPattern_omp main.cpp
LBP.cpp
)

set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)

target_link_libraries(LocalBinaryPattern_omp ${OpenCV_LIBS})
и фрагмент параллельного кода:

Код: Выделить всё

Mat drawHist(Mat &frame, int numThreads) {
int hist[256] = {0}; //init

#pragma omp parallel reduction(+:hist) default(none) shared(frame)
{
#pragma omp for
for (int i = 1; i < frame.rows-1; i++) {
for (int j = 1; j < frame.cols-1; j++) {
bitset code = createCode(frame, i, j);
hist[code.to_ulong()]++;
}
}
}
//some other stuff
Я знаю, что я мог бы изменить код и использовать частный массив для каждой гистограммы, а затем написать критическую секцию, но поскольку экзамен посвящен использованию самого openmp, я бы предпочел использовать «самую чистую» версию.
Здесь я нашел список всех компиляторов, поддерживающих более новую версию omp, но я не хочу снова сталкиваться с проблемой mingw и ссылками на библиотеку opencv.
Есть какие-нибудь предложения о том, какой еще компилятор мне следует использовать или, может быть, как правильно связать OpenCV с mingw? Спасибо большое!
P.s. Я использую Windows и знаю, что это, вероятно, основная причина всех моих проблем...

Подробнее здесь: https://stackoverflow.com/questions/791 ... -same-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»