Проблема с сокращением OpenMP на std :: vector, переданном по ссылке - PullRequest
0 голосов
/ 09 мая 2018

В компиляторе intel есть ошибка, связанная с пользовательским сокращением OpenMP, которая обсуждалась здесь (включая wrokaround). Теперь я хочу передать вектор в функцию и сделать то же самое, но я получаю эту ошибку:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc
Aborted

Это пример:

#include <iostream>
#include <vector>
#include <algorithm>
#include "omp.h"

#pragma omp declare reduction(vec_double_plus : std::vector<double> : \
                              std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>())) \
                    initializer(omp_priv = omp_orig)

int foo(std::vector<double> &w){

#pragma omp parallel reduction(vec_double_plus:w)
    {
#pragma omp for
        for (int i = 0; i < 2; ++i)
            for (int j = 0; j < w.size(); ++j)
                w[j] += 1;
    };

    return 0;
}

int main() {

    omp_set_num_threads(2);
    std::vector<double> w(10,0);
    foo(w);

    for(auto i:w)
        if(i != 2)
            std::cout << i << std::endl;

    return 0;
}

Опять же, он отлично работает с GNU / 6.4.0, но не работает с intel / 2018.1.163. Есть идеи?

Обновление: Я изменил значения, чтобы упростить отладку. Я работаю на удаленном узле, поэтому я использую терминал. Я использовал gdb для отладки кода, который был скомпилирован с intel / 2018.1.163. Я не уверен, что это правильно, или есть лучший способ отладки кода. Это ошибка из GDB:

[New Thread 0x2aaaac68a780 (LWP 15573)]
terminate called recursively
                        terminate called after throwing an instance of 'std::bad_alloc
Program received signal SIGABRT, Aborted.
0x00002aaaabaf91f7 in raise () from /lib64/libc.so.6

И это конфигурация cmake:

cmake_minimum_required(VERSION 3.2)
project(openmp_reduction001)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

find_package(OpenMP)
if(OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

add_executable(openmp_reduction001 main.cpp)

Update2: Результат обратного отслеживания в GDB добавляется в следующем. В вычислительном узле, который я использовал, модуль компилятора Intel загружен как компилятор по умолчанию, но он ищет в / usr / include / c ++ / 4.8.5 файлы заголовков. Это нормально? Я посмотрел в / usr / include / c ++ / . Он включает в себя только папки 4.4.7, 4.8.2, 4.8.5. Другая проблема заключается в строке # 12 , в которой длина вектора равна -15 , что, вероятно, приводит к тому, что std :: allocator устанавливает свой параметр n очень большое число.

#0  0x00002aaaabaf91f7 in raise () from /lib64/libc.so.6
#1  0x00002aaaabafa8e8 in abort () from /lib64/libc.so.6
#2  0x00002aaaaad2fa55 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#3  0x00002aaaaad2da36 in ?? () from /lib64/libstdc++.so.6
#4  0x00002aaaaad2da63 in std::terminate() () from /lib64/libstdc++.so.6
#5  0x00002aaaaad2dc83 in __cxa_throw () from /lib64/libstdc++.so.6
#6  0x00002aaaaad826d2 in std::__throw_bad_alloc() () from /lib64/libstdc++.so.6
#7  0x0000000000404022 in __gnu_cxx::new_allocator<double>::allocate (this=0x2aaaac689af0, __n=18446744073709551602)
    at /usr/include/c++/4.8.5/ext/new_allocator.h:102
#8  0x0000000000403856 in std::_Vector_base<double, std::allocator<double> >::_M_allocate (this=0x2aaaac689af0, __n=18446744073709551602)
    at /usr/include/c++/4.8.5/bits/stl_vector.h:168
#9  0x000000000040394b in std::_Vector_base<double, std::allocator<double> >::_M_create_storage (this=0x7fffffffa370, __n=18446744073709551601)
    at /usr/include/c++/4.8.5/bits/stl_vector.h:181
#10 0x00000000004037a6 in std::_Vector_base<double, std::allocator<double> >::_Vector_base (this=0x7fffffffa370, __n=18446744073709551601, __a=...)
    at /usr/include/c++/4.8.5/bits/stl_vector.h:136
#11 0x00000000004037fa in std::_Vector_base<double, std::allocator<double> >::_Vector_base (this=0x7fffffffa370)
    at /usr/include/c++/4.8.5/bits/stl_vector.h:134
#12 0x0000000000403b15 in std::vector<double, std::allocator<double> >::vector (this=0x7fffffffa370, 
    __x=std::vector of length -15, capacity -17592185515333 = {...}) at /usr/include/c++/4.8.5/bits/stl_vector.h:312
#13 0x0000000000402cd3 in __udr_i_0x914e698 (__omp_priv=0x7fffffffa370, __omp_orig=0x7fffffffa838)
    at /uufs/chpc.utah.edu/common/home/u1013493/openmp_reduction001/main.cpp:8
#14 0x0000000000402e7d in L__Z3fooRSt6vectorIdSaIdEE_14__par_region0_2_4 () at /uufs/chpc.utah.edu/common/home/u1013493/openmp_reduction001/main.cpp:14
#15 0x00002aaaab39e7a3 in __kmp_invoke_microtask ()
   from /uufs/chpc.utah.edu/sys/installdir/intel/compilers_and_libraries_2018.1.163/linux/compiler/lib/intel64/libiomp5.so
...