Size: a a a

2020 September 14

@N

@urandon Nikita Khom... in pro.cxx.holywars
в L1 данные загружаются порциями 64 байта
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
ты никак на это влиять не можешь
источник

IL

Ilya L in pro.cxx.holywars
@urandon Nikita Khomutov
ну не, надо же позаботиться про то, что на один элемент стоблца весь кешлайн почти вхолостую загружаешь
Как мне кажется под такие инструменты нужно сделать какой-нибудь постоянный публичный интерфейс и внедрить модульную имплементацию(например через шаблоны). И потом внутри сделать стандартный и привычный алгоритм, а затем под процессор делать выбор конкретной имплементации
источник

CC

Chris Calvin in pro.cxx.holywars
@urandon Nikita Khomutov
в L1 данные загружаются порциями 64 байта
В спарках по 128, не?
источник

YB

Yarique Belgorodsky in pro.cxx.holywars
@urandon Nikita Khomutov
ты не можешь без кеша, понятие "кешлайн" у тебя всё равно существует на уровне L1 кеша независимо от того, как ты пишешь код
#pragma vector nontemporal
источник

CC

Chris Calvin in pro.cxx.holywars
Ну это нюансы
источник

YB

Yarique Belgorodsky in pro.cxx.holywars
и кэширование нахуй
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
Chris Calvin
В спарках по 128, не?
я условно, на разных архитектурах по-разному
источник

AZ

Alexander Zaitsev in pro.cxx.holywars
Транс-сатанистский анархист с лозунгом «К чёрту полицию» выиграл номинацию на пост шерифа Нью-Хэмпшир из-за отсутствия конкурентов

Кандидат от народа
источник

CC

Chris Calvin in pro.cxx.holywars
Шерифа должен одобрить губернатор
источник

IL

Ilya L in pro.cxx.holywars
Ilya L
Как мне кажется под такие инструменты нужно сделать какой-нибудь постоянный публичный интерфейс и внедрить модульную имплементацию(например через шаблоны). И потом внутри сделать стандартный и привычный алгоритм, а затем под процессор делать выбор конкретной имплементации
(по крайне мере сейчас в рамках эксперимента в проекте  пытаюсь такую штуку делать, что бы мок-классы для тестов легко прокидывать)
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
Yarique Belgorodsky
#pragma vector nontemporal
ну эта прагма тебе обработает сразу cachline_size/sizeof(element) столбцов за раз, или опять же один элемент
источник

CC

Chris Calvin in pro.cxx.holywars
Это чучело не одобрят
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
@urandon Nikita Khomutov
ну эта прагма тебе обработает сразу cachline_size/sizeof(element) столбцов за раз, или опять же один элемент
если это будет один элемент, то опять же вхолостую L1 гоняешь
источник

YB

Yarique Belgorodsky in pro.cxx.holywars
@urandon Nikita Khomutov
ну эта прагма тебе обработает сразу cachline_size/sizeof(element) столбцов за раз, или опять же один элемент
короч надо мерять, но в любом случае векторизировать
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
Yarique Belgorodsky
короч надо мерять, но в любом случае векторизировать
ну там не надо ничего искусственно векторизовывать, векторизацию компилятор сам тут сделает
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
а вот порядок обхода данных компилятор за тебя не изменит
источник

p

pika42 in pro.cxx.holywars
@urandon Nikita Khomutov
ты никак на это влиять не можешь
Спорно, всегда Можно создать свою архитектуру
источник

@N

@urandon Nikita Khom... in pro.cxx.holywars
Yarique Belgorodsky
короч надо мерять, но в любом случае векторизировать
ну да, сначала VTune, потом думать, в реальности оно выглядит как-то так
источник

YB

Yarique Belgorodsky in pro.cxx.holywars
@urandon Nikita Khomutov
ну там не надо ничего искусственно векторизовывать, векторизацию компилятор сам тут сделает
нихуя он не может векторизировать а ля
    int i,j;//, ii=0,jj=0;
   // variables for vector section
   int vindexm [8]={0, MAX1, MAX1*2, MAX1*3, MAX1*4, MAX1*5, MAX1*6, MAX1*7 };
   __m256i vindex = _mm256_load_si256((__m256i *) &vindexm[0]);
   __m256 vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8;

       for(i=0; i<MAX1;  i+=8){            
           for(j=0; j<MAX2;  j+=8){
               //loading from columns
               vec1 = _mm256_i32gather_ps (&a[i][j+0],vindex,4);
               vec2 = _mm256_i32gather_ps (&a[i][j+1],vindex,4);
               vec3 = _mm256_i32gather_ps (&a[i][j+2],vindex,4);
               vec4 = _mm256_i32gather_ps (&a[i][j+3],vindex,4);
               vec5 = _mm256_i32gather_ps (&a[i][j+4],vindex,4);
               vec6 = _mm256_i32gather_ps (&a[i][j+5],vindex,4);
               vec7 = _mm256_i32gather_ps (&a[i][j+6],vindex,4);
               vec8 = _mm256_i32gather_ps (&a[i][j+7],vindex,4);

               //storing to the rows
               _mm256_store_ps(&a_tra[j+0][i], vec1);
               _mm256_store_ps(&a_tra[j+1][i], vec2);
               _mm256_store_ps(&a_tra[j+2][i], vec3);
               _mm256_store_ps(&a_tra[j+3][i], vec4);
               _mm256_store_ps(&a_tra[j+4][i], vec5);
               _mm256_store_ps(&a_tra[j+5][i], vec6);
               _mm256_store_ps(&a_tra[j+6][i], vec7);
               _mm256_store_ps(&a_tra[j+7][i], vec8);  
           }
       }

он слишком туп
источник