powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
16 сообщений из 16, страница 1 из 1
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Словил в линуксе segmentation fault на строке
Код: plaintext
1.
_m128i x = *p;


Причина оказалась в том что p = 0x24f25d8, т.е. не кратно 16. Выровнял - заработало.

Причем этот же код отлично работает в виндовсе (MSVC) с p не кратным 16.

Компилятор g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797485
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

в msvc _m128i всегда выравнивается на 16
в gcc нужно руками ровнять

(а вдруг используется _mm_loadu_si128 или _mm_storeu_si128 )
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797495
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПричина оказалась в том что p = 0x24f25d8, т.е. не кратно 16.

А как объявлен этот р?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797508
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TПричина оказалась в том что p = 0x24f25d8, т.е. не кратно 16.

А как объявлен этот р?

Код: plaintext
1.
2.
3.
4.
class msg_t : public lite_msg_t {
public:
	uint8_t data[MSG_SIZE];
};


p указатель на data.
new lite_msg_t выравнивается под кэш-линию проца, т.е. кратно 64. У lite_msg_t есть свои свойства, поэтому data не в начале.

Исходник тут , для получения проблемы закамментить в crypt_speed.cpp строку
Код: plaintext
1.
	size_t shift; // Для выравнивания адреса data


И ассерты отключить.

Проблема в aes128ni.h тут
Код: plaintext
1.
2.
3.
	void cbc_encrypt(void *buffer, size_t size) {
...
			__m128i v = _mm_xor_si128(*p, prev);


Я переписал эту строчку на две, вылетает на первой
Код: plaintext
1.
2.
_m128i x = *p;
__m128i v = _mm_xor_si128(x, prev);


Это мое скрещивание AES и CBC.

Полистал исходник AES, там так делают
Код: plaintext
1.
2.
3.
4.
5.
static void aes128ni_dec(__m128i *key_schedule, __m128i *cipherText, __m128i *plainText) {
	__m128i m = _mm_loadu_si128(cipherText);
	m = _mm_xor_si128(m, key_schedule[10 + 0]);
...
	_mm_storeu_si128(plainText, m);


Надо так же сделать, но странно что в MSVC работает. Отлаживать в консоли линукса очень грустно (((
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797511
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tp указатель на data.

То есть uint8_t*?

MSVC знает, что оно не выравнивает толком данные, поэтому применяет инстркции загрузки
невыравненных данных. GCC по умолчанию данные выравнивает и ожидает их выравненными,
поэтому применяет инструкции загрузки выравненных данных.

Можешь использовать
Код: sql
1.
2.
3.
#ifndef __x86_64
__attribute__ ((force_align_arg_pointer))
#endif


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797512
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima Tp указатель на data.

То есть uint8_t*?
Да.

Т.е. невыравнено в обоих, но MSVC не вылетает.
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797517
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало. Заменил прямое использование *p на _mm_loadu_si128(p) и _mm_storeu_si128(p, ...).
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДа.

А тебя не смущает, что при этом "x = *p" должно загружать всего один байт вместо
шестнадцати?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797534
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TДа.

А тебя не смущает, что при этом "x = *p" должно загружать всего один байт вместо
шестнадцати?..

Смущает что MSVC это разрешает, возможно там это как-то порешано. Надеюсь в MS не идиоты компилятор пишут.

Я перебираю алгоритмы и тестю их скорость, более тщательное изучение избранных будет потом и если описанная проблема есть, то оно вскроется.
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797553
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переменные типа _m128i автоматически выравниваются по 16-байтовым границам.
Говорит MSDN
https://docs.microsoft.com/ru-ru/cpp/cpp/m128i?view=vs-2019
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797564
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам.

Проблема не в них, а в указателе справа от знака присваивания. Он не _m128i*, что и
действует компилятору на нервы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797581
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам.

Проблема не в них, а в указателе справа от знака присваивания. Он не _m128i*, что и
действует компилятору на нервы.

У компилятора проблем нет, если бы он хоть намекнул ворнингом что так нельзя, но он проигнорил что это изначально не _m128i*
Код: plaintext
1.
2.
3.
4.
void cbc_encrypt(void *buffer, size_t size) {
...
		for (__m128i *p = (__m128i *)buffer; p < end; p++) {
			__m128i v = _mm_xor_si128(*p, prev);


В итоге я словил segmentation fault во время выполнения и убил два часа на поиски источника проблемы.
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797582
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам.
Говорит MSDN
https://docs.microsoft.com/ru-ru/cpp/cpp/m128i?view=vs-2019
Это про другое, у меня просто указатель void* приводится к _m128i* и это работает в MSVC (см. предыдущий пост). Если бы оно вылетело в MSVC, то я бы топик не поднял, там работает почему-то.
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39797619
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tу меня просто указатель void* приводится к _m128i*

Так делать нельзя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39798382
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
    #39808581
madb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

в msvc _m128i всегда выравнивается на 16
в gcc нужно руками ровнять

(а вдруг используется _mm_loadu_si128 или _mm_storeu_si128 )
Он же сказал, что без выравнивания на МСВЦ работает.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]