Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / msvc vs gcc при передачи 16-ти байтовой структуры как value / 9 сообщений из 9, страница 1 из 1
04.08.2016, 14:50
    #39286305
nojava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
Простейший код.
Передаем строку как структуру из указателя (64 бита, это важно), и 32 битные длину и емкость.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#include <stdio.h>

typedef struct {
  char *val;
  int len;
  int cap;
} str_t;

// str_t __attribute__ ((noinline)) test(str_t data) {

str_t __declspec(noinline) test(str_t data) {
  data.val++;
  data.len++;
  data.cap++;
  return data;
}

int main()
{
  str_t data = {0};

  data = test(data);

  printf("%p %d %d", data.val, data.len, data.cap );
  return 0;
}




Суть вопроса - MSVC был замечен за оччень хитрой оптимизацией. Он эту str_t data запаковал в XMM0 регистр

Код: plaintext
1.
2.
xorps       xmm0,xmm0  
movdqa      xmmword ptr [rsp+20h],xmm0  



т.е. использовал SIMD регистры для передачи 16-ти байтового параметра.
а вот GCC за таким не был замечен.

Вопрос - где можно почитать про такую хитрую оптимизацию MSVC, и как заставить GCC делать такое-же?
...
Рейтинг: 0 / 0
04.08.2016, 14:58
    #39286314
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
MS VC этой неотключаемой оптимизацией очень сильно гадит 18816450
Скорее всего в GCC по дефолту отключено использование SSE и надо как-то включить.
...
Рейтинг: 0 / 0
04.08.2016, 15:03
    #39286320
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
nojava,

__m256
...
Рейтинг: 0 / 0
04.08.2016, 15:17
    #39286339
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
nojava,
какая у тебя интересная жизнь, я даже завидую!
...
Рейтинг: 0 / 0
04.08.2016, 15:18
    #39286342
nojava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
Anatoly Moskovskynojava,

__m256

это 32 байта :) в задаче стоит 16.

впрочем, вкручивание

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
typedef union {
    __m128i m;
    struct {
      char *val;
      int  len;
      int cap;
    } v;
} str_t;



автоматом никакого эффекта не дало. хотя идея конечно прикольная.
...
Рейтинг: 0 / 0
04.08.2016, 15:24
    #39286351
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
nojavaкак заставить GCC делать такое-же?
Попробуй -march.

Но вот что меня смущает: если такую функцию экспортировать из DLL, её что, не получится
вызвать из GCC?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.08.2016, 15:30
    #39286356
nojava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
Dimitry Sibiryakovnojavaкак заставить GCC делать такое-же?
Попробуй -march.

Но вот что меня смущает: если такую функцию экспортировать из DLL, её что, не получится
вызвать из GCC?..


march и mtune до лампочки, не хотит их GCC.

экспорт функций не интересен, .so/.dll используются только для debug (чтоб побыстрее), релиз все равно собирается как the single executable blob.
...
Рейтинг: 0 / 0
04.08.2016, 18:53
    #39286540
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
gcc 6.1 с параметрами:-O2 -march=native
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        mov     QWORD PTR [rsp-16], 0
        lea     rdx, [rdi+1]
        lea     eax, [rsi+1]
        sar     rsi, 32
        mov     QWORD PTR [rsp-24], rdx
        vmovdqa xmm1, XMMWORD PTR [rsp-24]
        add     esi, 1
        vpinsrd xmm0, xmm1, eax, 2
        vpinsrd xmm2, xmm0, esi, 3
        vmovaps XMMWORD PTR [rsp-24], xmm2
        mov     rax, QWORD PTR [rsp-24]
        mov     rdx, QWORD PTR [rsp-16]
        ret


Остальные версии заставить не удалось. Кто хочет может попытаться онлайн .
...
Рейтинг: 0 / 0
04.08.2016, 19:19
    #39286554
nojava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
msvc vs gcc при передачи 16-ти байтовой структуры как value
Гость123gcc 6.1 с параметрами:-O2 -march=native
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        mov     QWORD PTR [rsp-16], 0
        lea     rdx, [rdi+1]
        lea     eax, [rsi+1]
        sar     rsi, 32
        mov     QWORD PTR [rsp-24], rdx
        vmovdqa xmm1, XMMWORD PTR [rsp-24]
        add     esi, 1
        vpinsrd xmm0, xmm1, eax, 2
        vpinsrd xmm2, xmm0, esi, 3
        vmovaps XMMWORD PTR [rsp-24], xmm2
        mov     rax, QWORD PTR [rsp-24]
        mov     rdx, QWORD PTR [rsp-16]
        ret


Остальные версии заставить не удалось. Кто хочет может попытаться онлайн .

круть, сенки вери мач за сайт! вопрос "как заставить gcc" снят.

что самое обидное, изменения в явном виде не показаны в https://gcc.gnu.org/gcc-6/changes.html
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / msvc vs gcc при передачи 16-ти байтовой структуры как value / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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