У меня проблема с g++14.2 и предыдущими версиями.
Когда я компилирую свою программу с помощью g++ -march=native -g, двоичный файл создает SIGSEGV только в процессорах Intel с набором инструкций AVX. Ни в моем ARM64, ни в Core2Duo Intel.
Когда я компилирую свою программу с помощью g++ -g, двоичный файл работает нормально на любой платформе.
Когда я компилирую свою программу с помощью g++ -march=native -O3, двоичный файл работает нормально на любой платформе (оптимизированный код?).
Место, где появляется SIGSEGV, вроде правильно. Это происходит непосредственно перед вызовом функции-члена из другой функции-члена.
Инструкция ассемблера, в которой появляется SIGSEGV:
=> 0x00007ff6074ea2b3 : vmovdqa %ymm0,-0x40(%rbp)
но похоже, что (rbp-0x40) не выровнено по 32 байтам:
rbp 0x5fec10
Я думаю, что это зависит от компилятора. Но я попытался применить alignas(32) к моим определениям, например:
alignas(32) band_matrix res2{.....}
но в любом случае rbp не выравнивается по 32 байтам.
Я минимизирую свою программу, что много раз работает (вероятно, когда rbp правильно выровнен по 32 байтам), но многие терпят неудачу (нет вывода)
#include
#include
template
struct container_view
{
typedef typename It::reference reference;
typedef std::remove_reference_t value_type;
typedef const reference const_reference;
constexpr container_view(It it, size_t s) noexcept : it(it), s(s) {}
constexpr It begin() const noexcept { return it; }
constexpr It end() const noexcept { return it + size(); }
constexpr reference operator[](size_t i) noexcept { return *(it + i); }
/// Size of container.
constexpr size_t size() const noexcept { return s; }
private:
It it;
size_t s;
};
template
struct shifted_vector
{
typedef std::remove_reference_t vector_type; ///< The type of vector.
T vec; ///< DenseVector of sequential non-zero elements.
S offset; ///< Offset of first non-zero element.
};
struct band_matrix_jump_iterator
{
typedef short value_type;
typedef short* pointer;
typedef short& reference;
private:
size_t b; // matrix's bandwidth
size_t v; // matrix's column
size_t e; // matrix's column's element's index.
pointer p; // Pointer to current element.
public:
constexpr band_matrix_jump_iterator(pointer p, size_t b, size_t v, size_t e) noexcept
: b{b}, v{v}, e{e}, p{p} {}
constexpr band_matrix_jump_iterator &operator++() noexcept { ++e; ++p; return *this; }
constexpr band_matrix_jump_iterator &operator+=(ptrdiff_t i) noexcept { e += i; p += i; return *this; }
constexpr band_matrix_jump_iterator operator+(ptrdiff_t i) const noexcept
{ band_matrix_jump_iterator t(*this); t += i; return t; }
constexpr reference operator*() const noexcept { return *p; }
constexpr bool operator==(const band_matrix_jump_iterator &it) const noexcept { return e == it.e; }
};
struct band_matrix
{
typedef short value_type;
typedef value_type* pointer;
constexpr size_t columns() const noexcept { return 10; }
size_t b;
pointer elements;
//---------------------------------------------------------------- TYPEDEFS OF ITERATORS AND VECTORS
typedef band_matrix_jump_iterator column_iterator;
typedef shifted_vector column_vector;
//--------------------------------------------------------------------------- CONSTRUCTORS / ASSIGNS
constexpr band_matrix(size_t b) : b{b}, elements(new value_type[10]) {}
constexpr ~band_matrix() noexcept { delete[] elements; }
//------------------------------------------ GET ROWS, COLUMNS, DIAGONAL AND CORRESPONDING ITERATORS
/// Return a beginning iterator to column \c i vector.
constexpr column_iterator column_begin(size_t i) noexcept
{ return column_iterator(elements + i, 0, i, 0); }
/// Return a vector view of column \c i.
constexpr column_vector column(size_t i) noexcept
{ return {typename column_vector::vector_type{column_begin(i), 1}, (uint8_t) i}; }
};
using namespace std;
int main()
{
band_matrix m(0);
for (size_t i = 0; i < 10; ++i) m.elements = i;
// checking columns
for (size_t i = 0; i < m.columns(); ++i)
{
auto v = m.column(i);
cout
Подробнее здесь: https://stackoverflow.com/questions/792 ... h-avx-cpus
SIGSEGV при компиляции с `g++ -march=native -g` на Intel с процессорами AVX ⇐ C++
Программы на C++. Форум разработчиков
1733775640
Anonymous
У меня проблема с g++14.2 и предыдущими версиями.
Когда я компилирую свою программу с помощью g++ -march=native -g, двоичный файл создает SIGSEGV только в процессорах Intel с набором инструкций AVX. Ни в моем ARM64, ни в Core2Duo Intel.
Когда я компилирую свою программу с помощью g++ -g, двоичный файл работает нормально на любой платформе.
Когда я компилирую свою программу с помощью g++ -march=native -O3, двоичный файл работает нормально на любой платформе (оптимизированный код?).
Место, где появляется SIGSEGV, вроде правильно. Это происходит непосредственно перед вызовом функции-члена из другой функции-члена.
Инструкция ассемблера, в которой появляется SIGSEGV:
=> 0x00007ff6074ea2b3 : vmovdqa %ymm0,-0x40(%rbp)
но похоже, что (rbp-0x40) не выровнено по 32 байтам:
rbp 0x5fec10
Я думаю, что это зависит от компилятора. Но я попытался применить alignas(32) к моим определениям, например:
alignas(32) band_matrix res2{.....}
но в любом случае rbp не выравнивается по 32 байтам.
Я минимизирую свою программу, что много раз работает (вероятно, когда rbp правильно выровнен по 32 байтам), но многие терпят неудачу (нет вывода)
#include
#include
template
struct container_view
{
typedef typename It::reference reference;
typedef std::remove_reference_t value_type;
typedef const reference const_reference;
constexpr container_view(It it, size_t s) noexcept : it(it), s(s) {}
constexpr It begin() const noexcept { return it; }
constexpr It end() const noexcept { return it + size(); }
constexpr reference operator[](size_t i) noexcept { return *(it + i); }
/// Size of container.
constexpr size_t size() const noexcept { return s; }
private:
It it;
size_t s;
};
template
struct shifted_vector
{
typedef std::remove_reference_t vector_type; ///< The type of vector.
T vec; ///< DenseVector of sequential non-zero elements.
S offset; ///< Offset of first non-zero element.
};
struct band_matrix_jump_iterator
{
typedef short value_type;
typedef short* pointer;
typedef short& reference;
private:
size_t b; // matrix's bandwidth
size_t v; // matrix's column
size_t e; // matrix's column's element's index.
pointer p; // Pointer to current element.
public:
constexpr band_matrix_jump_iterator(pointer p, size_t b, size_t v, size_t e) noexcept
: b{b}, v{v}, e{e}, p{p} {}
constexpr band_matrix_jump_iterator &operator++() noexcept { ++e; ++p; return *this; }
constexpr band_matrix_jump_iterator &operator+=(ptrdiff_t i) noexcept { e += i; p += i; return *this; }
constexpr band_matrix_jump_iterator operator+(ptrdiff_t i) const noexcept
{ band_matrix_jump_iterator t(*this); t += i; return t; }
constexpr reference operator*() const noexcept { return *p; }
constexpr bool operator==(const band_matrix_jump_iterator &it) const noexcept { return e == it.e; }
};
struct band_matrix
{
typedef short value_type;
typedef value_type* pointer;
constexpr size_t columns() const noexcept { return 10; }
size_t b;
pointer elements;
//---------------------------------------------------------------- TYPEDEFS OF ITERATORS AND VECTORS
typedef band_matrix_jump_iterator column_iterator;
typedef shifted_vector column_vector;
//--------------------------------------------------------------------------- CONSTRUCTORS / ASSIGNS
constexpr band_matrix(size_t b) : b{b}, elements(new value_type[10]) {}
constexpr ~band_matrix() noexcept { delete[] elements; }
//------------------------------------------ GET ROWS, COLUMNS, DIAGONAL AND CORRESPONDING ITERATORS
/// Return a beginning iterator to column \c i vector.
constexpr column_iterator column_begin(size_t i) noexcept
{ return column_iterator(elements + i, 0, i, 0); }
/// Return a vector view of column \c i.
constexpr column_vector column(size_t i) noexcept
{ return {typename column_vector::vector_type{column_begin(i), 1}, (uint8_t) i}; }
};
using namespace std;
int main()
{
band_matrix m(0);
for (size_t i = 0; i < 10; ++i) m.elements[i] = i;
// checking columns
for (size_t i = 0; i < m.columns(); ++i)
{
auto v = m.column(i);
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79263302/sigsegv-when-compile-with-g-march-native-g-on-intel-with-avx-cpus[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия