Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
Дмитрий Ховрич рассказывает как использовать строгую типизацию TypeScript и писать надёжный код в функциональном стиле. А также делится знаниями как использовать функторы и монады в ежедневной фронтенд разработке.
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+Alexander Myltsev
parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+
Доклад (https://www.youtube.com/watch?v=kZto4nWVlmA) от 29 мая для Moscow Scala Group (http://www.meetup.com/Scala-Moscow/events/180007162/)
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
Разработка библиотек — более ответственное дело, чем разработка прикладного программного обеспечения. Разработчик не знает, как именно будет использоваться его библиотека, и должен обращать дополнительное внимание на мелкие детали и вопросы переносимости. Это заставляет по-новому взглянуть на использование таких функций, как realloc, exit, memset, memcmp. Заставляет быть более аккуратным при выборе типов данных и способов обработки ошибок.
В докладе будет дан ряд советов, на что разработчикам библиотек стоит дополнительно обращать внимание на code review.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
The document discusses the benefits of exercise for mental health. Regular physical activity can help reduce anxiety and depression and improve mood and cognitive function. Exercise causes chemical changes in the brain that may help protect against mental illness and improve symptoms.
Точечная оценка. Определение
Пример 1
Свойства точечных оценок
Несмещенность
Пример 2
Состоятельность
Эффективность
Асимптотическая нормальность
Робастность
Описательная статистика, цели. Вариационный ряд
Полигон частот
Гистограмма
Гистограмма, пример. Выбор числа интервалов
Выборочные характеристики
Характеристики положения и рассеяния
Выборочные характеристики двумерной выборки
Основные задачи математической статистики. Примеры задач
Выборка.Выборочное пространство. Примеры
Простой случайный выбор. Реальные виды выборов
Функция распределения выборки
Эмпирическая вероятностная мера
Теорема Гливенко-Кантелли
This document defines continuity and uniform continuity of functions. A function f is continuous on a set S if small changes in the input x result in small changes in the output f(x). A function is uniformly continuous if the same relationship holds for all inputs and outputs simultaneously, not just for a fixed input. Several examples are provided to illustrate the difference. The key difference is that a continuous function may depend on the specific input point, while a uniformly continuous function does not. Functions that satisfy a Lipschitz inequality are proven to be uniformly continuous.
This document discusses algorithms for solving the coin change problem of finding the minimum number of coins needed to make a given monetary value. It describes greedy, recursive, and dynamic programming approaches. The greedy algorithm works optimally for coin denominations of 10, 5, 1 by always selecting the highest value coin first. However, the greedy approach does not always give the optimal solution in general. Dynamic programming improves on the recursive solution by storing intermediate results in an array to avoid recomputing the same subproblems.
The document discusses recurrences and methods for solving them. It covers:
1) Divide-and-conquer algorithms can often be modeled with recurrences. Examples include merge-sort and matrix multiplication.
2) Common methods for solving recurrences are substitution, iteration/recursion trees, and the master method. The master method provides a general solution for recurrences of the form T(n) = aT(n/b) + nc.
3) Strassen's matrix multiplication algorithm improves on the naive O(n^3) time by using a recurrence with a=7 to achieve O(n^2.81) time via the master method. Changing variables can sometimes simplify recurrences.
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
Сколько есть способов разбить натуральное число в сумму нескольких слагаемых, если суммы, отличающиеся только порядком слагаемых, считаются одинаковыми? Оказывается, что на этот, казалось бы, элементарный вопрос нет простого ответа. Зато теория, начинающаяся с этого вопроса, оказывается очень интересной, а ее результаты находят применение в самых разных разделах математики и математической физики.
Настоящая брошюра написана по материалам лекций, прочитанных автором на летней школе «Современная математика» в Дубне в июле 2013 года. Она рассчитана на старшеклассников и студентов младших курсов.
This document introduces asymptotic notation used to analyze the runtime of algorithms. Big O notation describes upper bounds on function growth, while Ω notation describes lower bounds. Functions are asymptotically equivalent (Θ) if they have matching upper and lower bounds. Limits can be used to establish relationships between asymptotic classes in some cases, but not always - examples show membership in a class does not necessarily imply limits exist.
Опечатки в слайдах на видео: в псевдокоде алгоритма решения непрерывной задачи о рюкзаке предметы должны сортироваться по убыванию (а не возрастанию) удельной стоимости.
- Определение чисел Фибоначчи, скорость роста
- Общая формула, экспоненциальная скорость роста
- Наивный алгоритм и анализ его времени работы
- Более быстрый алгоритм и анализ его времени работы, заключение
- Более детальный анализ алгоритма вычисления чисел Фибоначчи
- Определения O(⋅), преимущества и недостатки их использования для оценки времени работы алгоритмов
- Определения Ω(⋅),Θ(⋅),o(⋅), общие правила сравнения скорости роста стандартных функций
- Графики нескольких часто используемых функций
- Скорости часто используемых функций на практике, заключение
2. Типы данных
∙ Целочисленные:
1. char (символьный тип данных)
2. short int
3. int
4. long int
Могут быть беззнаковыми (unsigned).
∙ −2n−1
. . . (2n−1
− 1) (n — число бит)
∙ 0 . . . (2n
− 1) для unsigned
∙ Числа с плавающей точкой:
1. float, 4 байта, 7 значащих цифр.
2. double, 8 байт, 15 значащих цифр.
∙ Логический тип данных bool.
∙ Пустой тип void.
2/13
3. Литералы
∙ Целочисленные:
1. ’a’ — код буквы ’a’, тип char,
2. 42 — все целые числа по умолчанию типа int,
3. 1234567890L — суффикс ’L’ соответствует типу long,
4. 1703U — суффикс ’U’ соответствует типу unsigned int,
5. 2128506UL — соответствует типу unsigned long.
∙ Числа с плавающей точкой:
1. 3.14 — все числа с точкой по умолчанию типа double,
2. 2.71F — суффикс ’F’ соответствует типу float,
3. 3.0E8 — соответствует 3.0 · 108
.
∙ true и false — значения типа bool.
∙ Строки задаются в двойных кавычках: "Text string".
3/13
4. Переменные
∙ При определении переменной указывается её тип. При
определении можно сразу задать начальное значение
(инициализация).
int i = 10;
short j = 20;
bool b = false;
unsigned long l = 123123;
double x = 13.5, y = 3.1415;
float z;
∙ Нужно всегда инициализировать переменные.
∙ Нельзя определить переменную пустого типа void.
4/13
5. Операции
∙ Оператор присваивания: =.
∙ Арифметические:
1. бинарные: + - * / %,
2. унарные: ++ --.
∙ Логические:
1. бинарные: && ||,
2. унарные: !.
∙ Сравнения: == != > < >= <=.
∙ Приведения типов: (type).
∙ Сокращённые версии бинарных
операторов: += -= *= /= %=.
int i = 10;
i = (20 * 3) % 7;
int k = i++;
int l = --i;
bool b = !(k == l);
b = (a == 0) ||
(1 / a < 1);
double d = 3.1415;
float f = (int)d;
// d = d * (i + k)
d *= i + k;
5/13
6. Инструкции
∙ Выполнение состоит из последовательности инструкций.
∙ Инструкции выполняются одна за другой.
∙ Порядок вычислений внутри инструкций не определён.
/* unspecified behavior */
int i = 10;
i = (i += 5) + (i * 4);
∙ Блоки имеют вложенную область видимости:
int k = 10;
{
int k = 5 * i; // не видна за пределами блока
i = (k += 5) + 5;
}
k = k + 1;
6/13
7. Условные операторы
∙ Оператор if:
int d = b * b - 4 * a * c;
if ( d > 0 ) {
roots = 2;
} else if ( d == 0 ){
roots = 1;
} else {
roots = 0;
}
∙ Тернарный условный оператор:
int roots = 0;
if (d >= 0)
roots = (d > 0 ) ? 2 : 1;
7/13
8. Циклы
∙ Цикл while:
int squares = 0;
int k = 0;
while ( k < 10 ) {
squares += k * k;
k = k + 1;
}
∙ Цикл for:
for ( int k = 0; k < 10; k = k + 1 ) {
squares += k * k;
}
∙ Для выхода из цикла используется оператор break.
8/13
9. Функции
∙ В сигнатуре функции указывается тип возвращаемого
значений и типы параметров.
∙ Ключевое слово return возвращает значение.
double square(double x) {
return x * x;
}
∙ Переменные, определённые внутри функций, — локальные.
∙ Функция может возвращать void.
∙ Параметры передаются по значению (копируются).
void strange(double x, double y) {
x = y;
}
9/13
10. Макросы
∙ Макросами в C++ называют инструкции препроцессора.
∙ Препроцессор C++ является самостоятельным языком,
работающим с произвольными строками.
∙ Макросы можно использовать для определения функций:
int max1(int x, int y) {
return x > y ? x : y;
}
#define max2(x, y) x > y ? x : y
a = b + max2(c, d); // b + c > d ? c : d;
∙ Препроцессор “не знает” про синтаксис C++.
10/13
11. Макросы
∙ Параметры макросов нужно оборачивать в скобки:
#define max3(x, y) ((x) > (y) ? (x) : (y))
∙ Это не избавляет от всех проблем:
int a = 1;
int b = 1;
int c = max3 (++a, b);
// c = ((++a) > (b) ? (++a) : (b))
∙ Определять функции через макросы — плохая идея.
∙ Макросы можно использовать для условной компиляции:
#ifdef DEBUG
// дополнительные проверки
#endif
11/13
12. Ввод-вывод
∙ Будем использовать библиотеку <iostream>.
#include <iostream >
using namespace std;
∙ Ввод:
int a = 0;
int b = 0;
cin >> a >> b;
∙ Вывод:
cout << "a + b = " << (a + b) << endl;
12/13
13. Простая программа
#include <iostream >
using namespace std;
int main ()
{
int a = 0;
int b = 0;
cout << "Enter a and b: ";
cin >> a >> b;
cout << "a + b = " << (a + b) << endl;
return 0;
}
13/13