|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Словил в линуксе segmentation fault на строке Код: plaintext 1.
Причина оказалась в том что p = 0x24f25d8, т.е. не кратно 16. Выровнял - заработало. Причем этот же код отлично работает в виндовсе (MSVC) с p не кратным 16. Компилятор g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 17:15 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dima T, в msvc _m128i всегда выравнивается на 16 в gcc нужно руками ровнять (а вдруг используется _mm_loadu_si128 или _mm_storeu_si128 ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 17:59 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dima TПричина оказалась в том что p = 0x24f25d8, т.е. не кратно 16. А как объявлен этот р? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 18:15 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovDima TПричина оказалась в том что p = 0x24f25d8, т.е. не кратно 16. А как объявлен этот р? Код: plaintext 1. 2. 3. 4.
p указатель на data. new lite_msg_t выравнивается под кэш-линию проца, т.е. кратно 64. У lite_msg_t есть свои свойства, поэтому data не в начале. Исходник тут , для получения проблемы закамментить в crypt_speed.cpp строку Код: plaintext 1.
И ассерты отключить. Проблема в aes128ni.h тут Код: plaintext 1. 2. 3.
Я переписал эту строчку на две, вылетает на первой Код: plaintext 1. 2.
Это мое скрещивание AES и CBC. Полистал исходник AES, там так делают Код: plaintext 1. 2. 3. 4. 5.
Надо так же сделать, но странно что в MSVC работает. Отлаживать в консоли линукса очень грустно ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 18:42 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dima Tp указатель на data. То есть uint8_t*? MSVC знает, что оно не выравнивает толком данные, поэтому применяет инстркции загрузки невыравненных данных. GCC по умолчанию данные выравнивает и ожидает их выравненными, поэтому применяет инструкции загрузки выравненных данных. Можешь использовать Код: sql 1. 2. 3.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 18:50 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovDima Tp указатель на data. То есть uint8_t*? Да. Т.е. невыравнено в обоих, но MSVC не вылетает. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 18:55 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Заработало. Заменил прямое использование *p на _mm_loadu_si128(p) и _mm_storeu_si128(p, ...). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 19:05 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dima TДа. А тебя не смущает, что при этом "x = *p" должно загружать всего один байт вместо шестнадцати?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 20:03 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovDima TДа. А тебя не смущает, что при этом "x = *p" должно загружать всего один байт вместо шестнадцати?.. Смущает что MSVC это разрешает, возможно там это как-то порешано. Надеюсь в MS не идиоты компилятор пишут. Я перебираю алгоритмы и тестю их скорость, более тщательное изучение избранных будет потом и если описанная проблема есть, то оно вскроется. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 20:55 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Переменные типа _m128i автоматически выравниваются по 16-байтовым границам. Говорит MSDN https://docs.microsoft.com/ru-ru/cpp/cpp/m128i?view=vs-2019 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2019, 23:03 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
ИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам. Проблема не в них, а в указателе справа от знака присваивания. Он не _m128i*, что и действует компилятору на нервы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 00:42 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам. Проблема не в них, а в указателе справа от знака присваивания. Он не _m128i*, что и действует компилятору на нервы. У компилятора проблем нет, если бы он хоть намекнул ворнингом что так нельзя, но он проигнорил что это изначально не _m128i* Код: plaintext 1. 2. 3. 4.
В итоге я словил segmentation fault во время выполнения и убил два часа на поиски источника проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 09:50 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
ИзопропилПеременные типа _m128i автоматически выравниваются по 16-байтовым границам. Говорит MSDN https://docs.microsoft.com/ru-ru/cpp/cpp/m128i?view=vs-2019 Это про другое, у меня просто указатель void* приводится к _m128i* и это работает в MSVC (см. предыдущий пост). Если бы оно вылетело в MSVC, то я бы топик не поднял, там работает почему-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 09:53 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
Dima Tу меня просто указатель void* приводится к _m128i* Так делать нельзя. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 12:19 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 19:25 |
|
Почему _m128i* в линуксе вылетает без выравниванивания адреса кратно 16?
|
|||
---|---|---|---|
#18+
ИзопропилDima T, в msvc _m128i всегда выравнивается на 16 в gcc нужно руками ровнять (а вдруг используется _mm_loadu_si128 или _mm_storeu_si128 ) Он же сказал, что без выравнивания на МСВЦ работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2019, 20:57 |
|
|
start [/forum/topic.php?fid=57&msg=39808581&tid=2017620]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 405ms |
0 / 0 |