LINUX.ORG.RU

Производительность; илитный запил оптимальных реализаций и основы матчасти.

 , , ,


21

17

Поглядел я тут на пацанов и увидел прогресс в их глазах. Поэтому я решил вести тут свой бложик, в котором я буду толкать матчасть, разбирать/разрушать всякие мифы и легенды, а так же их обсуждать с пацанами. Банить меня не надо - тут всё будет очень культурно.

Это будет формат для самых маленьких, где я буду показывать как что-то пилится по-пацаночке. Его задача - на примерах пересказать штеудмануал тем, кому лень его читать, но кто очень любит спорить про код, перфоманс и матчасть. Ну и просто интересные наблюдения.

Изначально я хотел написать про то: что такое бесплатные вычисления на примере is_range() + сумма елементов массива, но тут выявилась смешная особенность, поэтому пока без is_range().

Начнём с простого - сумма елементов(float) массива. Как написать её быстро? Обычный крестопоц сделает так:

auto summ = accumulate(begin(vec), end(vec), 0.)

Этот код выдаёт 5.6GB/s(мы всё бенчим в л1д 32килобайта массив). Казалось бы, если бы мы слушали всяких «гуру», которые нам говорят: accumulate() - оптимизирован, «ты что умнее создатели stl"а?», «конпелятор умнее тебе - сам всё делает оптимально», «руками что-то делать слишком сложно и не нужно» - то мы бы там и остались с этими 5.6ГБ, но мы пойдём дальше и поймём почему так, и является ли это тем, что намн ужно.

Но посмотрев на код - он не векторизован:

	addq	$4, %rdx
	vcvtss2sd	-4(%rdx), %xmm2, %xmm2
	vaddsd	%xmm2, %xmm1, %xmm1

Почему? Патамучто это основная флоатпроблема: Он не ассоциативен - флоат не имеет в себе точных представлений всех чисел входящих в диапазон его «представления» т.е. порядкопроблемы.

Поэтому конпелятор НЕ ВЕКТОРИЗУЕТ флоат по умолчанию, ну никак. Даже такую банальщину.

Для решения этих проблем - есть ключик -funsafe-math-optimizations, который входит в -ffast-math, который кладёт на точность при вычислениях. Добавив его мы получаем уже 44.9GB/s.

Но теперь мы получаем ещё одну проблему - надо думать: «как бэ сунуть эту ключик не повредив там, где этот ключик не нужен».

Поэтому ноцанам, которые хотят быстро и не хоятт рандомных жоп из-за тупости конпелятора - пишут всё руками. Допустим на той же сишке это пишется так:

double memadd_autovec(buf_t buf) { //5.609465GB/s, либо 44.969652GB/s с ffast-math
  float * it = buf_begin(buf), * end = buf_end(buf), summ = 0.;
  do {
    summ += *it++;
  } while(it != end);
  return summ;
}

double hsumf(__v8sf v) {
  return (v[0] + v[1] + v[2] + v[3] + v[4] + v[5] + v[6] + v[7]);
}

double memadd_vec(buf_t buf) { //45.652002GB/s и класть на ffast-math
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Т.е. разницы никакой нет, кроме нужной нам реализации горизантального сложение вектора. Когда я говорил пацану: «векторную сишку для написания быстрого кода юзать намного проще, чем плюсы» - поцан нипонимэ, да и любые пацаны скажут - ну дак с -ffast-math оба выдают по 45гигов - нахрен эта сишка нужна?

А вот зачем:

double memadd(buf_t buf) { //132.878440GB/s
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;summ += *it++;summ += *it++;summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Это называется пацанский анролл копипастой, а вот заставить конпелятор нормально что-то разанролить очень сложно.

Если бы мы слушали всяких «гуру», которые нам вещают: «анрол говно и не нужен» - мы бы так и седели с 45-ю гигами, а так мы сидим с 132.878440GB/s. Т.е. анролл нам дал немного не мало ~300%.

Но основная мысль, которую толкают всякие «гуру» - это не надо следить за тактами/считать такты и прочее. Но мы о5 сделаем наоборот и посмотрим что будет.

Т.к. наш юзкейс упирается на 99% в throughput и дёргается одна инструкция, то нам достаточно просто считать теоретическую производительность для моего камня. 4.5(частота камня)*8(т.е. у нас камень с avx, то там вектор 32байта, либо 8флоатов.)*1(throughput нашей инструкции - в данном случае vpaddps из интел мануала). Т.е. 36гигафлопс, либо ~144гига. Т.е. мы сняли овер 90% теоретической производительности - остальные 10% у нас ушли в наши циклы, всякие горизонтальные суммы вектора и прочее, ну и конечно же чтение данных из кеша.

Но самое смешное - на моём хасвеле умножение имеет throughput 0.5 - т.е. на хасвеле умножение быстрее сложения. Это новая забористая трава у интела.

Казалось бы - какой жопой сложнее оказалось медленнее умножения - а вот так, на всяких штеудах производительность уже давно зависит не от каких-то технических возможностей, а от маркетинга и хотелок.

Поэтому очень смешно слушать, когда какие-то пацаны говорят: «float point имеет такую же производительность как и инты» - нет, оно имеет такоу же производительность лишь по причине того, что на штеуде инты тормазят так же, как и float.

И чтобы окончательно в этом убедится - мы взглянем на fma(вариации умножения со сложением/вычитанем), которые имеют throughput 0.5 - да, да - на хасвеле умножение+сложение в 2раза быстрее просто сложения. Это уже не просто трава - это что-то принципиально новое.

У целочисленного сложения же throughput 0.5 и казалось бы, если мы поменяем в нашей функции float на int - у нас будет сложение работать в 2раза быстрее, но это не так. Оно выдаёт те же 130гигов, а почему?

Вообще у камня есть такая фича, допустим у нас:

add $1, %reg0//вот тут инструкция add залочит регистр reg0
add $1, %reg0//а эта инструкция уйдёт в лок до особождения предыдущей инструкцией регистра reg0

Чтобы такой жопы небыло - есть специальная фича:

add $1, %reg0//lock reg0
add $1, %reg0//И тут вместо того, чтобы уйти в лок - камень вместо reg0 даёт инструкции любой свободный регистр.

Эта фича называется прееименование регистров, либо как-то так - мне лень гуглить.

Дак вот штука в том, что фича работает через жопу. Мне лень читать мануал и искать почему так, но штука в том, что она ограничивает throughput. На умножении и целочисленном сложении она огранивает throughput c 0.5 до 1.

И вот я решил заюзать сложении через fma:

__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);// a + b * 1. == a + b.
}

double memadd_fma(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ = fmaadd(summ, *it++);
  } while(it != end);
  return hsumf(summ);
}

Но меня ждала жопа: 27.347290GB/s, причем не анролл и ничего не помогал. Я уж подумал, что мануал наврал, но позже до меня допёрло: у неё latency 5тактов и ((4.5×8)÷5)×4 ~= 29гигов - т.е. я получаю производительность с её latency, но какой жопой оно так?

Потом я вспомнил, что гцц гинерит анрольный код вида:

add $1, %reg0
add $1, %reg0
//а не
add $1, %reg0
add $1, %reg1

Т.е. на неё вообще не работает переименовывание регистров - и инструкции постоянно в локе. Я это проверил и оказался прав. Ну и я написал такой мемадд:


__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
}

inline void fma_10way_finality(__v8sf * cache, __v8sf * it, __v8sf * end) {
  switch(end - it) {
    case 8:
      *(cache + 7) = fmaadd(*(cache + 7), *(it + 7));
      *(cache + 6) = fmaadd(*(cache + 6), *(it + 6));
    case 6:
      *(cache + 5) = fmaadd(*(cache + 5), *(it + 5));
      *(cache + 4) = fmaadd(*(cache + 4), *(it + 4));
    case 4:
      *(cache + 3) = fmaadd(*(cache + 3), *(it + 3));
      *(cache + 2) = fmaadd(*(cache + 2), *(it + 2));
    case 2:
      *(cache + 1) = fmaadd(*(cache + 1), *(it + 1));
      *(cache + 0) = fmaadd(*(cache + 0), *(it + 0));
    case 0:
      break;
    default: error_at_line(-1, 0, __FILE__, __LINE__, "bad_aligned");
  }
}

double memaddfma_10way(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = (__v8sf){};
  __v8sf * cache = (__v8sf[10]){{}};
  uint64_t i = 0;
  while((it += 10) <= end) {
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    i = 0;
  }
  fma_10way_finality(cache, (it - 10), end);
  summ = (*(cache + 0) + *(cache + 1) + *(cache + 2) + *(cache + 3) +
	  *(cache + 4) + *(cache + 5) + *(cache + 6) + *(cache + 7) +
	  *(cache + 8) + *(cache + 9));
  return hsumf(summ);
}

Пришлось хреначить финалити, ибо тут «анролл» на 10, а почему на 10 - для максимального throughput"а - надо, чтобы каждый каждый регистр юзался через 5тактов - т.е. 10регистров.

И вся эта порятнка нужна для борьбы с тупостью конпелятора.

Это уже: 214.167252GB/s(раельно там в районе 250 - просто мой бенч говно). 107 гигафлопс на ведро. Из теоретических 144, но тут уже влияние кеша. Причем 50+ из которых выкидываются и просто бесплатные.

Теперь вопрос к пацанам - что нам дадут эти гагфлопсы, когда у нас будет массив не 32килобайта, а 32мегабайта? Зачем нужно выживать максимум, когда скорость памяти отсилы 20-30гигабайт и нам хватит даже С++ кода с ffast-math?

Ну и призываются упомянутые мною пацаны: mv - этот тот експерт, что вещал про «руками переименовывать регистры не надо» и «анрол ваще ненужен», emulek вещал про ненужность счёта тактов, и не понимал что такое «беслпатно», AIv - не понимал в чем проблема плюсов, ck114 - так же не понимал в чем проблема плюсов.

Бенчи: https://gist.github.com/superhackkiller1997/606be26fa158ef75501d - вроде я там ничего не напутал.

P.S. - не выпиливайте пж, пусть пацаны «нужно» или «не нужно». Мне интеерсно. Ну и там рекомендации пацанов.



Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от devl547

Уйди пж, сходи в вебдевелопмент - там тебе ближе. Зачем ты отвечаешь, если тебе нечего ответить, при этом сев в лужу?

Твои говнамд - это слитые на кристале x86 с сопроцессором СОВЕРШЕННО ДРУГОЙ АРХИТЕКТУРЫ. У неё есть х86 часть и всё остальное, если ты не можешь это понять - я уже сказал в каких разделах тебе надо общаться.

Максимум чем оно отличается от х86 - это хардварным, чистым биндингом твоей гпушке к х86. Но один хрен это никак не относится к самому х86.

И да, ты мне осилишь сказать, что там не так? Или ты это просто так, форфан кукарекнул? Хотябы один пример?

Увезите его.

Carb_blog
() автор топика
Ответ на: комментарий от Carb_blog

Разные модули, разные задержки инструкций и разные SIMD юниты.

Повторюсь - сравни документацию на AMD Phenom II и AMD FX.

это слитые на кристале x86 с сопроцессором СОВЕРШЕННО ДРУГОЙ АРХИТЕКТУРЫ.

Наличие у некоторых моделей IGP к теме вообще не относится.

devl547 ★★★★★
()
Последнее исправление: devl547 (всего исправлений: 1)
Ответ на: комментарий от devl547

И? Это микроархитектура, а не архитектура процессора.

Разные модули, разные задержки инструкций и разные SIMD юниты.

И? Как это относится к инструкциям, их переименованию и прочему? В адмд запилил бесплатную переименовалку вопреки всех законов? Нет. Значит всё так же работает.

Максимум, что там поменяли - это добавили fma/avx, если это что-то новое + всякай байда, типа crc/виртуализации у интела.

Обычно в твоей говноархитектуре меняют всякий обвес, типа паков/унпаков, всяких блендов/масок и прочего для подготовки данных. Сами дробилки никто почти не трогает.

Да и какая разница? Ну поменяли - стал у тебя add быстрей - молодец, будет быстрее - не стал? Покласть - будет тоже самое. Что поменяется?

Вон там быстрый add через fma - это фича хасвелла, а остально всё работает и для остальных.

Ещё раз вам повторяю - каждый ваш выхлоп должен основаваться на чем-то. Тыж не просто так кукарекаешь, хотя скорее всего просто так, но попытайся. Высскажи предпосылки, которые сподвигли тебя на твоей выхлоп, а так - бла-бла.

Carb_blog
() автор топика
Ответ на: комментарий от tailgunner

Т.е. пацан мне предлогает сравнивать с протухшим мусором, у которого даже avx нет, я уж не говорю про фма - т.е. в 2-4раза медленне по определению.

Даже в памяти оно сольёт, ибо не nt.

SSE_FUNCTION static void
add_f32_sse (float *dest, float *src1, float *src2, int n)
{
  /* Initial operations to align the destination pointer */
  for (; ((long)dest & 15) && (n > 0); n--) {
    *dest++ = *src1++ + *src2++;
  }
  for (; n >= 4; n -= 4) {
    __m128 xmm0, xmm1;
    xmm0 = _mm_loadu_ps(src1);
    xmm1 = _mm_loadu_ps(src2);
    xmm0 = _mm_add_ps(xmm0, xmm1);
    _mm_store_ps(dest, xmm0);
    dest += 4;
    src1 += 4;
    src2 += 4;
  }
  for (; n > 0; n--) {
    *dest++ = *src1++ + *src2++;
  }
}

https://gist.github.com/superhackkiller1997/c3bb651940d84a579424

Заккоменть проверки дебильные на выравнивание, разанроль - оно написанно по даунистически и хрен разанролишь копипастой. Я вставил функцию без изменений.

Carb_blog
() автор топика
Ответ на: комментарий от Carb_blog

может ты что-то полезное напишешь, с твоей упоротостью? Может матрицу на вектор помножишь? Пойми: складывать float'ы не нужно.

emulek
()

вот кстати задачка:

Дано: Over9000 векторов 1×5. Одна матрица 5×5. Требуется помножить эти вектора, на эту матрицу. На выходе должно получится Over9000 векторов 1×5. Тип чисел: uint32_t.

emulek
()
Ответ на: комментарий от emulek

Как так не нужно, всё основанно на сложении - сумма не нужна, и то тебе, а вдруг мнен адо стреднюю темпиратуру побольнице?

Ещё раз для емулеков повторю - мне класть на твоё сложение, я не осбираюсь считать сумму твоих бомжатских флоатов - я тебе привел пример. В нём ничего не изменится, даже если ты туда 2входа и выход поставишь, как в данном примере - даже быстрее будет.

Замени там += на *=, а 2входа замени на один - вот тебе скалирование - это же популярно?

«Матрица» никому нен ужна - это для бомжей нулёвых.

Carb_blog
() автор топика
Ответ на: комментарий от emulek

Ты мне напиши: что такое вектор, что такое матрица, что значит «умножить». Мне лень всё гуглить - так уж и быть, заплию.

Carb_blog
() автор топика
Ответ на: комментарий от Carb_blog

Ты мне напиши: что такое вектор, что такое матрица, что значит «умножить». Мне лень всё гуглить - так уж и быть, заплию.

в вике всё есть:

http://ru.wikipedia.org/wiki/Умножение_матриц#.D0.9E.D0.BF.D1.80.D0.B5.D0.B4....

c[j] = ∑ a[j]*b[j][k]

например для 2×2

c[0] = a[0]*b[0][0]+a[1]*b[1][0];
c[1] = a[0]*b[0][1]+a[1]*b[1][1];

что в матричной форме эквивалентно

С = A * B

Тебе требуется запилить для 5×5. Да, я для 4×4 сам могу, это анскильно и не нужно.

emulek
()
Ответ на: комментарий от Carb_blog

всё основанно на сложении - сумма не нужна

ох... не, ну сумма вправду часто не нужна. Сейчас все работают с расширенными полями Галуа, над 2ⁿ, там «сумма» нужна, вот только она XOR. Которая ⊕. Я сейчас занимаюсь другими полями, но они ещё хуже.

«Матрица» никому нен ужна - это для бомжей нулёвых.

детка, а практическое применение ты уже придумал?

emulek
()
Ответ на: комментарий от emulek

Ты, по ходу, уже сам с собой начал сраться. :)

BRE ★★
()
Ответ на: комментарий от Carb_blog

Вообще-то их тут 10050.

Не льсти себе. У тебя всего-лишь одна банальная оптимизация конкретной связки «задача+железо», причем невалидная. Ты все такое же ничтожество, пойми это.

О5 ты кукарекаешь нихрена не понимая, под какой-такой «конпелятор»? Где там юзается что-то от конпелятора? Ты же мне покажешь?

Давно intrinsic не зависят от компилятора?

Вообще-то это общее для всех архитектур, под одну архитектуру там только add, который работает в 2раза быстрее дефолтного. О5 пробалаболился.

Что же тут общее для всех архитектур? Векторизация? AVX? Интеловские хаки? Ты или тупой или прикидываешься. Но нет, ты не прикидываешься.

Ты прочитал в треде про IPP - молодец, теперь погугли что это. И как так не нужным, в чем ненужный?

И без тебя знаю что это и давно использую. Отличнейшая либа.

Да, кукарекатинг вземлю спущу. Загоню в говно всего под ноль.

Да что я плачу, еслиб я мог выражатся свободно - т ы бы давно убежал в слезах, как ты это делал не раз.

И это все, что ты можешь сказать.

Т.е. подожди, абсалютно необразованный, невежественный балабол-пхпист, который НИЧЕГО нужного не сделал в своей жизни, бесполезный кусок курлыкающего коечего рассказывает мне что-то? А ну ок.

Психология подсказывает, что все эти придуманные рассказы про «НИЧЕГО нужного не сделал в своей жизни» - прямное отражение тебя и твоих комплексов. Ты сейчас прям нам свою биографию рассказываешь. Тебе небось недавно PHPисты по морде надавали, да?

Pavval ★★★★★
()
Ответ на: комментарий от emulek

> Тебе требуется запилить для 5×5

у меня в проекте 14×6, и даже более. Для 5×5 я и без тебя запилил, УМВР.

Забыл перелогиниться? Лол.

Deleted
()
Ответ на: комментарий от emulek

«Сейчас все работают с расширенными полями Галуа, над 2ⁿ, там «сумма» нужна, вот только она XOR. Которая ⊕. Я сейчас занимаюсь другими полями, но они ещё хуже.»

«Все» - это кто?

anonymous
()

facepalm

Но посмотрев на код - он не векторизован:

Лучше бы ты по русскому языку «илитный запил» сделал...

anonymous
()
Ответ на: комментарий от Pavval

Не льсти себе. У тебя всего-лишь одна банальная оптимизация конкретной связки «задача+железо», причем невалидная. Ты все такое же ничтожество, пойми это.

Одна - это какая? Покажи её. Какая такая связка и какая такая «задача-железо»?

Понимаешь, если бы это было так - ты бы не ссался со мною поспорить, посорвеноваться, сказать что-то внятно, а раз ты ссышься - это «ко-ко-ко невнятное».

Давно intrinsic не зависят от компилятора?

Какой жопой они зависят от конпелятора? Это штеуд-стандарт, который есть во всех конпеляторах.

icc - есть, gcc - есть, clang - есть, да везде - этот код даже tcc через жопу соберёт.

И да, где там intrinsic, загуглил новое слово? Покажешь? Там только fmaadd.

Что же тут общее для всех архитектур?

Тут общее для всех «архитектур» всё, кроме fma и то не факт.

Векторизация?

Новое слово загуглил? Да, представь себе она есть не только в х86, а почти во всех архитектурах с производительностью чутьб больше нуля.

А уж в х86 - это основа лет 10как.

AVX?

Новую абривиатуру загуглил? Это общие для всех х86.

Интеловские хаки?

Где тут «интеловские» хаки? Покажешь?

Ты или тупой или прикидываешься. Но нет, ты не прикидываешься.

Что-то конкретное сказать хотел? Погугли ещё, авось что-то да сможешь.

И без тебя знаю что это и давно использую. Отличнейшая либа.

До, до. Дак она же штеудонли с интеловскими хаками, как жешь ты её используешь? 2строчки назад кукарекал обратное.

И это все, что ты можешь сказать.

Нет, ты на это не сомг ответить. В том и проблема, а сказать нечего тебе, а если бы было - ты бы такую херню не нёс.

Психология подсказывает, что все эти придуманные рассказы про «НИЧЕГО нужного не сделал в своей жизни» - прямное отражение тебя и твоих комплексов.

Т.е. ты сам себя уличил? Кукарекать про «Несделал» начал ты - это прямое отражение тебя и твоих комплексов, молодец.

Дак ты мне ответишь, что ты сделал? Ничего?

Ты сейчас прям нам свою биографию рассказываешь.

Собственно как и ты, прям сейчас нам свою биографию рассказываешь.

Тебе небось недавно PHPисты по морде надавали, да?

Как это на уровне нищего примата уровня 3-го курса недовуза.

Ты пример рядового пхписта - нулёвое ничтожество, которое пытается что-то из себя строить. Мыслительных способностей которого даже на попытку не загонять себя в лужу не хватает.

Ах да, тебе небось интеловские хаки недавно по роже надавали, да?

Carb_blog
() автор топика
Ответ на: комментарий от Pavval

О5 лезешь? Уже не знаешь чиго-бы кукарекнуть?

Тыж нам расскажешь и покажешь почему я не прав, и зачем сравнивать? Или так - ко-ко-ко?

Carb_blog
() автор топика
Ответ на: комментарий от Carb_blog

Товарищ, у вас нездоровая склонность к «петушиной» тематике. Вы сами-то, случайно, не из «этих» будете? :)

htower_ ★★
()
Ответ на: комментарий от Carb_blog

Ты мне напиши: что такое вектор, что такое матрица, что значит «умножить». Мне лень всё гуглить - так уж и быть, заплию.

Давно я так не ржал. Это даже круче высера про десятичные флоаты.

Ну вот, а кто-то на первой странице говорил, что пациент первый курс закончил. Выходит, не закончил. Даже не начинал.

anonymous
()

Какой жопой они зависят от конпелятора? Это штеуд-стандарт, который есть во всех конпеляторах.
icc - есть, gcc - есть, clang - есть, да везде - этот код даже tcc через жопу соберёт.

Куда уж там лепетать про intrinsic-ы. ТС настолько анскильная лалка, что не умеет использовать printf:

gcc 4.9.0:

memad_bench.c: В функции «fma_10way_finality»:
memad_bench.c:103:5: предупреждение: format «%lu» expects argument of type «long unsigned int», but argument 6 has type «int» [-Wformat=]

Но самая мякотка вот тут:

In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/immintrin.h:41:0,
                 from /usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/x86intrin.h:46,
                 from memad_bench.c:9:
memad_bench.c: В функции «fmaadd»:
/usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/avxintrin.h:1281:1: ошибка: inlining failed in call to always_inline «_mm256_set1_ps»: target specific option mismatch
 _mm256_set1_ps (float __A)
 ^
memad_bench.c:71:10: ошибка: которая вызвана здесь
   return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
          ^
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/immintrin.h:61:0,
                 from /usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/x86intrin.h:46,
                 from memad_bench.c:9:
/usr/lib/gcc/i686-pc-linux-gnu/4.9.0/include/fmaintrin.h:63:1: ошибка: inlining failed in call to always_inline «_mm256_fmadd_ps»: target specific option mismatch
 _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
 ^
memad_bench.c:71:10: ошибка: которая вызвана здесь
   return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
Код ТСа не собирается, и это печальный факт. При этом он умудряется нести ахинею про «У тебя в каменье fma хоть есть? Оно у тебя не нашло _mm256_fmadd_ps() - значит нема», салютно не вкупая, что ВОЗМОЖНОСТЬ КОМПИЛЯЦИИ на железке не имеет никакого отношения к ВОЗМОЖНОСТИ ЗАПУСКА на железке. И компилятор, который умеет собирать код под некоторую платформу — он на любой железке одинаковый. Просто тотальный фейл супирхакира2000.

этот код даже tcc через жопу соберёт

Я думаю, тот факт, что ты неграмотный п***л, не требует развернутых доказательств.

tcc memad_bench.c 
memad_bench.c:8: error: include file 'omp.h' not found

anonymous
()
Ответ на: комментарий от no-such-file

Есть разница. Кстати, я сейчас допёр, ты же считаешь сумму частями по 8 флоатов - этим спасаешься, в данном конкретном примере.

Нет, ты не допёр - там 80аккамуляторов, а не 8.

Carb_blog
() автор топика
Ответ на: комментарий от anonymous

Куда уж там лепетать про intrinsic-ы. ТС настолько анскильная лалка, что не умеет использовать printf:

32битное убожество? Подучи матчасть.

Код ТСа не собирается, и это печальный факт. При этом он умудряется нести ахинею про «У тебя в каменье fma хоть есть? Оно у тебя не нашло _mm256_fmadd_ps() - значит нема», салютно не вкупая, что ВОЗМОЖНОСТЬ КОМПИЛЯЦИИ на железке не имеет никакого отношения к ВОЗМОЖНОСТИ ЗАПУСКА на железке. И компилятор, который умеет собирать код под некоторую платформу — он на любой железке одинаковый. Просто тотальный фейл супирхакира2000.

Как ты закукарекал, как закукарекал. А ты не подумал своей пробитой шапканасилкой, что за включение симдов отвечает -march=native, а т.к. у тебя нет fma, то -march=native его и не включает.

-mfma - вперёд, больше не кукарекай и не пытайся даже.

Я думаю, тот факт, что ты неграмотный п***л, не требует развернутых доказательств.

Это бенч, а не код - это omp, который не реализован в тцц. omp_get_wtime() - загуглишь, либо напишешь сам.

Эти пхписты, который решили меня ловить. Яж там не зря написал, что соберётся он только через жопу - можешь проверить - вырубит бенч, либо собери -c. Хотя пхпистам этого не дано.

Carb_blog
() автор топика
Ответ на: комментарий от Carb_blog

32битное убожество? Подучи матчасть.

Ты? Ну видимо, да. Но я думаю, для твоего мозга 32 бита слишком много. Вот 16 в самый раз.

А ты не подумал своей пробитой шапканасилкой, что за включение симдов отвечает -march=native, а т.к. у тебя нет fma, то -march=native его и не включает.

Командная строка для сборки твоего поделия указана в первой строке сорца. Или ты думаешь, когда после твоих кривых рук на производстве что-нибудь навернётся, ты сможешь отмазаться про то, что админ не мог исправить косяки твоей шапканасилы?

Учись нести ответственность за ту херню, которую ты пишешь.

Это бенч, а не код - это omp, который не реализован в тцц. omp_get_wtime() - загуглишь, либо напишешь сам.

Что и требовалось доказать. Учись нести ответственность за свои вскукареки. Тогда они, может быть, станут походить на слова.

anonymous
()
Ответ на: комментарий от Carb_blog

Анскильная лалка – это ты. Не удосужился даже привести свой код к собираемому виду, а понтов на два района ниггеров пришедших к успеху.

anonymous
()
Ответ на: комментарий от anonymous

Ты? Ну видимо, да. Но я думаю, для твоего мозга 32 бита слишком много. Вот 16 в самый раз.

Лужа?

Командная строка для сборки твоего поделия указана в первой строке сорца. Или ты думаешь, когда после твоих кривых рук на производстве что-нибудь навернётся, ты сможешь отмазаться про то, что админ не мог исправить косяки твоей шапканасилы?

Да, и для сборкии её нужен нормальный камень. Нет камня - нет сборки - всё просто.

Оо, офисная планктонятинка начинает рассуждать о чем-то за гранью офиса, дак вот - собрал? Обосрался? Теперь запусти - навернулось, а тыж так хотел собрать?

В том и суть натива, чтобы у таких макак как ты ничего не навернулось, а просто не собралось.

Учись нести ответственность за ту херню, которую ты пишешь.

Какую я пишу? Примеры приведи? С чего оно вообще должно собираться на твоём говне? С чего оно вообще должно собираться, если оно работать не будет?

Что и требовалось доказать. Учись нести ответственность за свои вскукареки. Тогда они, может быть, станут походить на слова.

Какая такая отвественно - я сказал векторная сишка на tcc соберётся - оно соберётся, ибо в отлии от тебя, нулёвого говна - я знаю что я гвоорю.

А вот omp нет даже в шланге, хотя судя по твоих курлыканьем возможно появился, либо ты просто не осилил им собрать.

Что ты сказать хотело, ничтожество?

Carb_blog
() автор топика
Ответ на: комментарий от anonymous

Ещё раз, он собирается, он не собирает там, где он не запустится. А не запустится он по причине отсутвия у тебя нужного камня. Это твои проблемы, балаболка, а не мои.

Carb_blog
() автор топика

Господа, вы понимаете разницу между числом и его представлением? dec(0.5) == bin(0.1) (0*2^1 + 1*2^-1)

Мантиссы и экспоненты это уже форматопроблемы (железопроблемы).

anonymous
()
Ответ на: комментарий от anonymous

но флоат - это как раз тип данных, а не число

anonymous
()
Ответ на: комментарий от Carb_blog

Ещё раз, он собирается, он не собирает там, где он не запустится. А не запустится он по причине отсутвия у тебя нужного камня. Это твои проблемы, балаболка, а не мои.

Балаболка – это ты. Выкатил пацанам байтоёбской копипасты, в надежде что они поверят тебе на слово? Откуда мне знать, что твой верно считает и способен дать заявленную тобой скорость? Поверить тебе на слово, балаболка? Какой там процессор нужен, чтоб собрать это?

anonymous
()
Ответ на: комментарий от anonymous

Господа, вы понимаете разницу между числом и его представлением? dec(0.5) == bin(0.1) (0*2^1 + 1*2^-1)
Мантиссы и экспоненты это уже форматопроблемы (железопроблемы).

Фишка в том, что в компе нет чисел, а только «представления». Число это вообще понятие сугубо абстрактное, существующее только в голове человека как концепция.

И вот те представления, которые перемалывает FPU в быдлопрограмме ТСа, — двоичные.

anonymous
()
Ответ на: комментарий от anonymous

Фишка в том, что ко-ко-ко ... в голове ко-ко-ко кококонцепция.

Ну началось. Сейчас в ход пойдут аналогии и Гёдель.

И вот те представления, которые перемалывает FPU в быдлопрограмме ТСа, — двоичные.

Двоичные представления с десятичной мантиссой и экспонентой, записанными в двоичном виде? Мощно.

anonymous
()
Ответ на: комментарий от anonymous

ко-ко-ко ... в голове ко-ко-ко кококонцепция.

ТС, ты забыл залогиниться.

Двоичные представления с десятичной мантиссой и экспонентой, записанными в двоичном виде? Мощно.

С двоичными мантиссой и экспонентой, дружочек. С двоичными. Иди уже покури учебники.

anonymous
()
Ответ на: комментарий от anonymous

Балаболка – это ты. Выкатил пацанам байтоёбской копипасты, в надежде что они поверят тебе на слово?

Купи - проверь. Закомменть бенч с фма.

Откуда мне знать, что твой верно считает и способен дать заявленную тобой скорость?

Об этом написанно в мануале интела, о котором ты так яростно кукарекал, английским по белому. Ты же его читал?

Поверить тебе на слово, балаболка?

Поверить мануалу интела, я там объяснил почему оно быстрее - ты это можешь проверить в мануале интела.

Какой там процессор нужен, чтоб собрать это?

Там написанно про fma - почитай где он есть, и я там написал - на хасвелле.

Carb_blog
() автор топика
Ответ на: комментарий от emulek

так с матрицами ты слил, да?

А ты думаешь, что человек, который не знает, что такое матрицы, в принципе может что-то там напрограммировать?

anonymous
()
Ответ на: комментарий от anonymous

А ты думаешь, что человек, который не знает, что такое матрицы, в принципе может что-то там напрограммировать?

я думаю, что он в школе учился, и про СЛАУ ему рассказывали.

Или СЛАУ из школьной программы исключили? Когда я учился(в 80х), СЛАУ было. Даже с тремя переменными.

emulek
()
Ответ на: комментарий от anonymous

какую-то уету в школе сейчас проходят. На выходе имеем ТСа и подобных...

emulek
()
Ответ на: комментарий от vertexua

Похоже, нужно совсем слететь, чтобы придумать такой образ себе :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.