В компиляторе 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