Tbb Parallel_for: Объект с узлом интрузивного списка может одновременно быть частью только одного интрузивного списка.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Tbb Parallel_for: Объект с узлом интрузивного списка может одновременно быть частью только одного интрузивного списка.

Сообщение Anonymous »

В настоящее время я переношу программу, изначально написанную для Windows 10, в систему Redhat (

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

VERSION_ID="8.8"
), который имеет g++ версии 8.50. 20210514 (Red Hat 8.5.0-18). Я установил tbb с помощью vcpkg. Я свел свою проблему к следующему минимальному рабочему примеру. (Обратите внимание, исходный проект содержит более сотни файлов. Я пытался сохранить некоторые вещи из CMakeLists.txt, которые могут быть связаны, но я не уверен):
< р>

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

CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_BUILD_TYPE Debug)
else()
set(CMAKE_CXX_FLAGS "-Wall -mtune=native -march=native -g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fno-math-errno -fno-signed-zeros -fno-trapping-math-freciprocal-math -fno-rounding-math -fno-signaling-nans -fexcess-precision=fast")
endif()

project(Example LANGUAGES CXX VERSION 0.9)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

add_executable(example
example.cpp
)

find_package(TBB CONFIG REQUIRED)

target_link_libraries(example
TBB::tbb
TBB::tbbmalloc
)

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

vcpkg.json:
{
"name": "vt",
"version-string": "",
"dependencies": [
"tbb"
],
"builtin-baseline": "36fb23307e10cc6ffcec566c46c4bb3f567c82c6"
}

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

example.cpp:
#include 

#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"

int main()
{
std::vector vec(100);
for (size_t i = 0; i < vec.size(); ++i){
vec[i] = i;
}

tbb::parallel_for(tbb::blocked_range(0, vec.size()),
[&](tbb::blocked_range r)
{
for (size_t i = r.begin(); i < r.end(); ++i)
{
vec[i] = vec[i]+1;
}
});

return 0;
}
Это прекрасно компилируется и работает на моем компьютере с Windows (с использованием Visual Studio). Он также компилируется на машине Red Hat, однако работает только в режиме отладки. При компиляции в режиме Release я получаю следующую ошибку:

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

Assertion node(val).my_prev_node == &node(val) && node(val).my_next_node == &node(val) failed (located in the push_front function, line in file: 135)
Detailed description: Object with intrusive list node can be part of only one intrusive list simultaneously
Aborted (core dumped)
Для сборки в режиме выпуска я запускаю следующее:

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

mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=~/vcpkg/scripts/buildsystems/vcpkg.cmake ..
cmake --build .
(Для отладки я просто добавляю -DCMAKE_BUILD_TYPE=Debug к вызову конфигурации cmake)

Некоторые вещи, которые я пробовал (не сработало):
  • удалить встроенную базовую линию из vcpkg.json
  • удалить все параметры, установленные для CMAKE_CXX_FLAGS_RELEASE
  • удалить набор(CMAKE_INTERPROCEDURAL_OPTIMZATION TRUE)
  • удалить набор (CMAKE_CXX_VISIBILITY_PRESET скрыт)
Я тоже пробовал сделать вот это, маленькое проблема на моей личной машине с Ubuntu 22.04.1 LTS (с g++ версии 11.3.0), и я получил точно такие же результаты. Он компилируется, но работает только в режиме Debug, но не Release, что приводит к той же ошибке, что и выше.

Подробнее здесь: https://stackoverflow.com/questions/763 ... one-intrus
Ответить

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

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

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

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

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