🦖 Айти Тудэй 🦥
8.56K subscribers
15K photos
796 videos
18 files
2.02K links
Авторский бутик айти мемов и не только
Всё самое полезное по тэгу #деградироватьпришёл

Разбан https://t.me/ithueti/18131

Футболочки и чат для своих http://ithueti.club

Реклама: http://ithueti.club/ad / https://telega.in/c/ithueti
Download Telegram
Forwarded from флипы онлайн (Евгений Сабиров)
😐
Please open Telegram to view this post
VIEW IN TELEGRAM
3712😢1
😁121😢22
This media is not supported in your browser
VIEW IN TELEGRAM
19🥰2
И остров кайфовый, и в физике человек не последний...
102
Forwarded from Я не нанят
🥰70💋11
Forwarded from Я не нанят
😁751997😢1
Forwarded from Сиолошная
На что только не пойдешь из-за дефицита памяти и роста цен:
Недавно продемонстрировали передачу данных по 200-километровому оптоволокну на скорости 256 Тбит/с. Суть в том, что пока свет летит эти 200 км, внутри самого кабеля «в полете» одновременно находится 32 ГБ данных — получается своеобразное хранилище с пропускной способностью 32 ТБ/с. Так как у нейросетей порядок обращения к весам заранее известен и предсказуем, можно представить забавную систему вообще без оперативной памяти (DRAM). Веса просто крутятся по замкнутому оптоволоконному кольцу и залетают в L2-кэш чипа ровно в тот момент, когда они нужны для вычислений. Это по сути современный аналог древней памяти на ртутных линиях задержки. Чтобы запускать модели на триллионы параметров, такие петли пришлось бы выстраивать в сложные конвейеры, но, учитывая, что пропускная способность оптоволокна растет быстрее, чем скорость DRAM, когда-нибудь это может стать реальностью.

Если же говорить о более практичных вещах, то можно просто взять много дешевой флеш-памяти и объединить её в массив (параллельно), чтобы получить почти любую требуемую скорость чтения. Главное условие — читать данные крупными блоками (страницами) и грамотно настроить предзагрузку, чтобы данные приходили на чип заранее, перекрывая задержки доступа. Это решение подошло бы для инференса уже сегодня, если бы производители флеш-памяти и AI-ускорителей смогли договориться о едином высокоскоростном стандарте подключения.


Если не знать автора твита, то можно подумать, что это наркомания 👀 а идея интересная с инженерной точки зрения
Please open Telegram to view this post
VIEW IN TELEGRAM
4411😁3
Forwarded from Backtracking (Dima Vesnin)
wc3ui это ui кит со всеми кнопками, слайдерами, прогресс барами и другими компонентами чтобы собрать ui сайта в стиле warcraft 3

поддерживает 4 темы: люди, орки, ночные эльфы и андеды

https://wc3ui.banteg.xyz/
1✍63🥰22😍4😱2
Не забывайте проверяться!
5813
Я уже больше 15 лет программирую, а только сегодня осознал что type casting имеет больше общего с отливкой метала, чем я бы мог подумать.

https://en.wikipedia.org/wiki/Metal_casting

https://en.wikipedia.org/wiki/Type_casting_(typography)

#деградироватьпришёл
👏14🤯4🦄2
Типичная история, когда печатаешь что-то в цикле, надо отдельно обрабатывать конец строки и конец вывода, получается есть 2 стула:
void print_lazy() {
for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= 5; ++j) {
std::cout << i << j << "_"; // Допустим
}
std::cout << ";\n"; // Буэ
}
}

void print_beauty() {
for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= 5; ++j) {
std::cout << i << j;
if(j < 5) {
std::cout << "_"; // Мда
}
}
std::cout << (i < 5 ? ";\n" : "."); // Ну ладно
}
}


И соответствующий вывод:
print_lazy():
11_12_13_14_15_;
21_22_23_24_25_;
31_32_33_34_35_;
41_42_43_44_45_;
51_52_53_54_55_;
^- extra spaces
^- and an empty line
also the code sucks
---
print_beauty():
11_12_13_14_15;
21_22_23_24_25;
31_32_33_34_35;
41_42_43_44_45;
51_52_53_54_55.
the result looks good but not the code


Но, кажется, есть вариант получше:
void print_smart() {
for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= 5; ++j) {
std::cout << i << j << (j == 5 ? (i == 5 ? "." : ";\n") : "_");
}
}
}


print_smart():
11_12_13_14_15;
21_22_23_24_25;
31_32_33_34_35;
41_42_43_44_45;
51_52_53_54_55.
the result and the code looks good(???)


Конструкция (j == 5 ? (i == 5 ? "." : ";\n") : "_") не самая приятная, но в целом, если её обернуть в функцию и забыть, допустим. Но что если есть вариант попроще?

static const char* separator[]{" ", "\n", ""};

const char* separator_shifted(bool last_col, bool last_row) {
return separator[last_col << last_row];
}


«Что за херня тут происходит?», спросите вы и будете правы, но т.к. мы всё равно прячем одну когнитивно нагруженную конструкцию в функцию, может быть есть другая, не такая сложная на первый взгляд, а там глядишь и битовые операции нам пару инструкций выиграют, лучше же, чем 2 сравнения делать, правда?

Для начала, чтобы разобраться что за херня, bool кастится в int со значением 0 или 1, и происходит соответствующий сдвиг нуля или единицы на 0 или 1 бит, то есть в результате правильной операции мы можем получить числа 0, 1 или 10 (то есть 2), что является индексом в массиве separator.
// true << true == 2, последняя колонка и последняя строка - ничего не нужно
// true << false == 1, последняя колонка и не последняя строка - перенос строки
// false << true == 0, не последняя колонка и последняя строка - пробел
// false << false == 0, не последняя колонка и не последняя строка - пробел


Что касается кхм... производительности, давайте посмотрим итоговое число инструкций на уровне оптимизации -O3:
// 3 asm lines
int index_shift(bool last_col, bool last_row) {
return last_col << last_row;
}

// 5 asm lines
int index_cond(bool last_col, bool last_row) {
return last_col ? (last_row ? 2 : 1) : 0;
}


Получается битовый сдвиг и правда дешевле, чем 2 условия?! Ну, почти, когда доходит до дела, то есть нюансы:
// 5 asm lines
const char* separator_shifted(bool last_col, bool last_row) {
return separator[last_col << last_row];
}

// 5 asm lines
const char* separator_cond(bool last_col, bool last_row) {
return separator[last_col ? (last_row ? 2 : 1) : 0];
}


Но, конечно, сделать хуже всегда можно:
// 7 asm lines
const char* separator_cond_local(bool last_col, bool last_row) {
return last_col ? (last_row ? "" : "\n") : " ";
}


Весь код можете посмотреть тут https://godbolt.org/z/YKs9vzM6o.

«Ну и какие выводы?», спросит пытливый читатель! — Не ебите мозги.

Очевидно что код separator_cond читается буквально как «Последняя колонка? Последняя строка? 2. Нет - 1. Ах и первое нет - тогда 0.»
Код вида
last_col << last_row в момент озарения, когда ты всё таки понял авторскую задумку же, читается так: «Ааа, ооо, да, смешно. Долбоеб.»
Если у компилятора достаточно контекста, то он сам оптимизирует код не хуже, чем вы, изъебываясь над байтиками, а может даже и лучше. И, однозначно, он сделает это быстрее, чем вы.


Лучше бы #деградироватьпришёл.
✍32😁128🤡7💋1
6823😢6😍6🌭2
748😢2😁1🐳1