Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Мифы сишной кодогенерации

Спасибо товарищу Ганди за наше счастливое детство! Теперь есть тулза https://godbolt.org/, дабы смотреть на асм, генерируемый gcc и icc, притом почти без говна!

Сверху 4 кнопки, надо включить последние три (ну или две, если вам не нравится DWORD PTR а нравятся процентики).

В-общем ниже сурс, пастим его туда и подтверждаем (пусть и на искусственных примерах):

- Наивная кодогенерация генерит наивный но достаточно вменяемый код
- При коммандлайне -O2 всё инлайнится и генерится достаточно хороший асм (но по уёбищным по меркам 80386)
- При коммандлайне -O3 -march=native получается вырвиглазный векторизированный код (и по-моему он же с loop unroll).
// Type your code here, or load an example.
int square(int num) {
    return num * num;
}

int sqq(int num) {
  return square(square(num));
}

void sqa(int *in, int *out)
{
  for (unsigned i = 0; i < 128; i++)
  {
    out[i] = sqq(in[i]);
  }
}
Вопрос - можно ли заставить gcc/icc генерить менее вырвиглазную векторизацию? Ну и вообще если расслабить требования и потребовать возвести 128 чисел в 4-ю степень, не важно каких чисел и как они лежат, какой будет исходник на сях?

(там есть троллфейс-вариант возведения 1-битовых чисел, который id/nop, но может оказаться например что 16-битные unsigned, лежащие в каком-нибудь спецмассиве из sse-четвёрок, проще)

Upd: нестандартный __restrict помогает
Tags: programming, до чего техника дошла
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 9 comments