Re[2]: Опять кадровики "радуют"
От: so5team https://stiffstream.com
Дата: 16.11.18 08:59
Оценка: 9 (1) +2 :))) :))) :))
Здравствуйте, RussianFellow, Вы писали:

RF>Что такое распараллеливание?


Это когда на собеседовании драться нужно одновременно с несколькими противниками.

RF>Что такое разделяемые переменные?


Это когда во время драки на собеседовании вы хватаетесь за стул, но за этот же стул одновременно хватается и ваш противник. В этом случае стул и будет той самой разделяемой переменной, своевременный захват которой обеспечит вам победу.
Re: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 15.11.18 17:32
Оценка: 9 (1) +2 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>1. Сделать это при помощи рекурсии
CM>2. Таким образом, чтобы это можно было распараллелить
CM>3. Не использовать никакие разделяемые переменные

Да вроде особо без проблем:

template <typename Iter>
void rev(Iter from, Iter mid, Iter to)
{
    const auto len = mid - from;
 
    if (len == 0)
    {
        return;
    }
    else if (len == 1)
    {
        std::iter_swap(from, to - 1);
        return;
    }
 
    auto left = from + ( len / 2 );
    auto right = to - ( len / 2 );
 
    auto t1 = std::thread{ [=]() { rev(from, left, to); } };
    auto t2 = std::thread{ [=]() { rev(left, mid, right); } };
 
    t1.join();
    t2.join();
}
 
template <typename Iter>
void rev(Iter begin, Iter end)
{
    const auto len = end - begin;
    rev(begin, begin + (len / 2), end);
}


live пример
Re: Опять кадровики "радуют"
От: elmal  
Дата: 16.11.18 04:42
Оценка: +3 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл

CM>Кто-нибудь видит?
Кстати, конкретно эта задача на собеседовании имеет смысл. Основная идея — просто понимание что ты знаешь о таком приеме, как разделяй и властвуй.
Соответственно для тривиального случая возвращаешь исходный массив. Для вырожденного из двух элементов делаешь перестановку. Для основного случая дробишь на части, запускаешь над каждой частью в параллель рекурсивно обращение массива. Далее джоинишь результаты, итерируясь в обратном порядке. Это кстати можно сделать аналогично через рекурсию и на месте, правда будет выглядеть грязно.

Никакие разделяемые переменные ты тут не создаешь. Параллелизация есть. Рекурсия есть. Все условия выполняются. Правда алгоритмическая сложность кабздец какая стала, но чтоб не тормозило условий не было . Чтоб не тормозило, кстати, на практике там можно взять вырожденный случай не из двух элементов, а из миллиона. И вырожденный случай обрабатывать традиционным способом. И все, мы при этом даже ускорение легко сделали на количество ядер.

Мне задача понравилась тем, что она отсеет Артемку, не умеющего программировать, но зазубрившего типичные задачи и мнящего себя богом. И не оторвана от реальности, так как в реальности зачастую нужно весьма сложный алгоритм как то легко распараллелить, с минимальной модификацией исходного кода. Ибо исходный код может быть весьма сложен и запутанен. В результате на практике мы на некоторых алгоритмах получим ускорение, при этом хаос в коде становится не сильно ужаснее. И сделаем требуемое от нас быстро.
Re: Опять кадровики "радуют"
От: ononim  
Дата: 15.11.18 16:33
Оценка: :)))
CM>Кто-нибудь видит?
unsigned char array[32] = {...};
for (int i = 0; i < sizeof(array); ++i) {
    if (fork() == 0) {
        sleep(sizeof(array) - i);
        print("%02x ", array[i]);
    }
}


  Скрытый текст
классика же
Как много веселых ребят, и все делают велосипед...
Отредактировано 15.11.2018 16:34 ononim . Предыдущая версия .
Re[6]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 18:13
Оценка: :)))
Здравствуйте, Voivoid, Вы писали:

V>Это ты про что вообще? У моего кода со всем вышеперечисленным нет никаких проблем. Реверсь хоть std::string'и, хоть 128 битные int'ы, хоть под x86, хоть под x64.



Данные читаются и пишутся порциями по 64 бита, просто на уровне железа. А это значит, что читать и писать атомарно и без локов можно только данные порциями по 64 бита (т.е. сами данные не более 64 бит и выравнены по интервалу б4 бита). Во всех остальных случаях, операции записи будут цеплять соседние элементы.
Что касатеся std::string, ЕМНИП там есть основной объект (который в массиве) и плюс к нему отдельная память в хипе.

В общем — читать учебник, бегом.
Отредактировано 15.11.2018 18:18 CodeMonkey . Предыдущая версия .
Re[3]: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 15.11.18 17:47
Оценка: +2
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, Voivoid, Вы писали:


V>>Да вроде особо без проблем:


CM>Снова не соблюдается пункт 3

Все соблюдается. Ни одна переменная не доступна более чем из одного потока. Ни один элемент массива не будет модифицирован более чем одним потоком. Но если тебе прям очень хочется, то можешь сделать копию массива и реверсить уже её.

Ну или пиши что тогда по твоему означают разделяемые переменные
Re[4]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 17:54
Оценка: :))
Здравствуйте, Voivoid, Вы писали:

V>Все соблюдается. Ни одна переменная не доступна более чем из одного потока. Ни один элемент массива не будет модифицирован более чем одним потоком.


Только если допустить, что архитектура — x86, данные — примитивные и правильно выравнены, а размер данных — не более 64 бит. Что не упоминается ни в условиях задачи, ни тобой
И даже на x86, если у тебя просто массив int32 без пропусков для выравнивания, то будет полный ёк.

V>Но если тебе прям очень хочется, то можешь сделать копию массива и реверсить уже её.


Не мне, а кадровикам.
Отредактировано 15.11.2018 17:59 CodeMonkey . Предыдущая версия .
Re[7]: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 15.11.18 18:37
Оценка: +1 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, Voivoid, Вы писали:


V>>Это ты про что вообще? У моего кода со всем вышеперечисленным нет никаких проблем. Реверсь хоть std::string'и, хоть 128 битные int'ы, хоть под x86, хоть под x64.


CM>

CM>Данные читаются и пишутся порциями по 64 бита, просто на уровне железа. А это значит, что читать и писать атомарно и без локов можно только данные порциями по 64 бита (т.е. сами данные не более 64 бит и выравнены по интервалу б4 бита). Во всех остальных случаях, операции записи будут цеплять соседние элементы.

В моем примере нет конкурентного доступа к данным. Вообще. Кстати в этом и был смысл задачи. К чему ты тут вообще завел речь об атомарности и локах — я не знаю. И, кроме того, если мы говорим про C++, то начиная с 11-го стандарта у языка появилась наконец-то своя модель памяти и если уж очень хочется, то вести обсуждение надо в её контексте.
Re[10]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 20:35
Оценка: :))
Здравствуйте, Voivoid, Вы писали:

V>Ну тогда наверное не затруднит его указать?


Уже указал. http://rsdn.org/forum/job/7298592?tree=tree
Автор: CodeMonkey
Дата: 15.11.18

Какие-то незнакомые слова? Атомарность, конкурентный доступ?
Re[2]: Опять кадровики "радуют"
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 16.11.18 07:04
Оценка: +1 :)
Здравствуйте, elmal, Вы писали:

E>Кстати, конкретно эта задача на собеседовании имеет смысл. Основная идея — просто понимание что ты знаешь о таком приеме, как разделяй и властвуй.

E> ...

Тут было всё верно.

E>Мне задача понравилась тем, что она отсеет Артемку, не умеющего программировать, но зазубрившего типичные задачи и мнящего себя богом.

E> ...

А вот тут ты сильно не прав... я просто с ним работал пару лет. Очень приличный уровень как у разработчика, побольше б таких
Re[11]: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 16.11.18 07:08
Оценка: +1 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, Voivoid, Вы писали:


V>>Ну тогда наверное не затруднит его указать?


CM>Уже указал. http://rsdn.org/forum/job/7298592?tree=tree
Автор: CodeMonkey
Дата: 15.11.18

CM>Какие-то незнакомые слова? Атомарность, конкурентный доступ?

Что-то прям анекдот вспомнился:
"Армяне лучше чем грузины!"
"Чем лучше? Чем??"
"Чем, чем... Я же сказал, чем грузины!"

Вопросов больше не имею
Re[2]: Опять кадровики "радуют"
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.11.18 07:42
Оценка: +1 :)
Здравствуйте, ononim, Вы писали:

CM>>Кто-нибудь видит?

O>unsigned char array[32] = {...};
O>for (int i = 0; i < sizeof(array); ++i) {
O>    if (fork() == 0) {
O>        sleep(sizeof(array) - i);
O>        print("%02x ", array[i]);
O>    }
O>}


За int — расстрел на месте.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Опять кадровики "радуют"
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 16.11.18 08:52
Оценка: -1 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>1. Сделать это при помощи рекурсии
CM>2. Таким образом, чтобы это можно было распараллелить

Что такое распараллеливание?

CM>3. Не использовать никакие разделяемые переменные


Что такое разделяемые переменные?
1613 г. = 2024 г.
Re[2]: Опять кадровики "радуют"
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.11.18 09:01
Оценка: +1 :)
Здравствуйте, RussianFellow, Вы писали:

CM>>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>>1. Сделать это при помощи рекурсии
CM>>2. Таким образом, чтобы это можно было распараллелить

RF>Что такое распараллеливание?


Сейчас, подожди. Я дискету отформатирую и покажу.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Опять кадровики "радуют"
От: Stanislav V. Zudin Россия  
Дата: 16.11.18 09:46
Оценка: +1 :)
Здравствуйте, Muxa, Вы писали:

RF>>>Что такое распараллеливание?

КД>>Сейчас, подожди. Я дискету отформатирую и покажу.
M>Эту шутку он не поймёт.

Если меня склероз не подводит, то по возрасту RF должен был застать fido. Эта шутка там ходила.
И что-то мне подсказывает, что он вас троллит самым откровенным образом
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Опять кадровики "радуют"
От: B0FEE664  
Дата: 15.11.18 17:03
Оценка: :)
Здравствуйте, CodeMonkey, Вы писали:

BFE>>N/2 одновременно запущенных корутин сделают своё дело. Точно! Шаблонная Variadic функция запускающая каждый swap в отдельном процессе.


CM>Самый большой вопрос — как на выходе получить массив Конверсия в массив из всего этого добра сожрет больше ресурсов, чем просто разворот в цикле (и делать это надо в один поток, поскольку см пункт 3)



а зачем его получать?:
template <class T>
void Swap(T& l, T& r)
{
  T t = std::move(l);
  l = std::move(r);
  r = std::move(t);
}

std::array<int, 4> arr{{1,2,3,4}};

std::thread t1(Swap<int, int>, arr[0], arr[3]);
std::thread t2(Swap<int, int>, arr[1], arr[2]);
...
И каждый день — без права на ошибку...
Отредактировано 15.11.2018 17:04 B0FEE664 . Предыдущая версия .
Re[5]: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 15.11.18 18:07
Оценка: :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, Voivoid, Вы писали:


V>>Все соблюдается. Ни одна переменная не доступна более чем из одного потока. Ни один элемент массива не будет модифицирован более чем одним потоком.


CM>Только если допустить, что архитектура — x86, данные — примитивные и правильно выравнены, а размер данных — не более 64 бит. Что не упоминается ни в условиях задачи, ни тобой


Это ты про что вообще? У моего кода со всем вышеперечисленным нет никаких проблем. Реверсь хоть std::string'и, хоть 128 битные int'ы, хоть под x86, хоть под x64.

V>>Но если тебе прям очень хочется, то можешь сделать копию массива и реверсить уже её.


CM>Не мне, а кадровикам.


Телепат?
Re: Опять кадровики "радуют"
От: StatujaLeha на правах ИМХО
Дата: 15.11.18 18:43
Оценка: +1
Здравствуйте, CodeMonkey, Вы писали:

CM>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>1. Сделать это при помощи рекурсии
CM>2. Таким образом, чтобы это можно было распараллелить
CM>3. Не использовать никакие разделяемые переменные

CM>Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл

CM>Кто-нибудь видит?

Может массив распределенный и лежит на нескольких машинах?
Тогда
1. Не знаю зачем
2. Очевидно: можно данные на различных нодах обрабатывать параллельно
3. Очевидно: разделяемые переменные в распределенной среде это сразу будет еще одна отдельная задача, без которой тут можно обойтись
Re[7]: Опять кадровики "радуют"
От: B0FEE664  
Дата: 16.11.18 08:36
Оценка: :)
Здравствуйте, CodeMonkey, Вы писали:

BFE>>Насколько я понимаю, пункт 3 выполнен.

CM>Озвучь ход мысли.

Voivoid всё правильно сказал.
И каждый день — без права на ошибку...
Re[13]: Опять кадровики "радуют"
От: Muxa  
Дата: 16.11.18 16:01
Оценка: +1
CM>Я написал совершенно конкретно, в каких условиях возможно писать без блокировки и почему у тебя это невозможно.
А это нарушение какого из трех пунктов?
Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 15:59
Оценка:
Итак, задача. Нужно развернуть массив (именно массив). Но:
1. Сделать это при помощи рекурсии
2. Таким образом, чтобы это можно было распараллелить
3. Не использовать никакие разделяемые переменные

Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл
Кто-нибудь видит?
Re: Опять кадровики "радуют"
От: B0FEE664  
Дата: 15.11.18 16:23
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>1. Сделать это при помощи рекурсии
легко
CM>2. Таким образом, чтобы это можно было распараллелить
можно
CM>3. Не использовать никакие разделяемые переменные
а сам массив?

CM>Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл

если у вас очень много процессоров, то почему нет? N/2 одновременно запущенных корутин сделают своё дело. Точно! Шаблонная Variadic функция запускающая каждый swap в отдельном процессе.

CM>Кто-нибудь видит?

Ну это типа поиска максимума в массиве на GPU процессоре: запустить сравнение двух соседних элементов для всего массива сразу, а потом сравнить соседние результаты и повторять, пока не останется один элемент.
И каждый день — без права на ошибку...
Re[2]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 16:43
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>а сам массив?


Переменные нельзя. Исходный массив — можно, если он не меняется.

BFE>N/2 одновременно запущенных корутин сделают своё дело. Точно! Шаблонная Variadic функция запускающая каждый swap в отдельном процессе.


Самый большой вопрос — как на выходе получить массив Конверсия в массив из всего этого добра сожрет больше ресурсов, чем просто разворот в цикле (и делать это надо в один поток, поскольку см пункт 3)
Отредактировано 15.11.2018 16:44 CodeMonkey . Предыдущая версия .
Re[4]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 17:09
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>
BFE>template <class T>
BFE>void Swap(T& l, T& r)
BFE>{
BFE>  T t = std::move(l);
BFE>  l = std::move(r);
BFE>  r = std::move(t);
BFE>}

BFE>std::array<int, 4> arr{{1,2,3,4}};

BFE>std::thread t1(Swap<int, int>, arr[0], arr[3]);
BFE>std::thread t2(Swap<int, int>, arr[1], arr[2]);
BFE>...
BFE>


Не соблюдается пункт 3 — никаких разделяемых переменных. У тебя массив изменяется и разделяется.
Re[5]: Опять кадровики "радуют"
От: B0FEE664  
Дата: 15.11.18 17:18
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Не соблюдается пункт 3 — никаких разделяемых переменных. У тебя массив изменяется и разделяется.

Насколько я понимаю, пункт 3 выполнен.
И каждый день — без права на ошибку...
Re[6]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 17:22
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Насколько я понимаю, пункт 3 выполнен.


Озвучь ход мысли.
Re[2]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 17:36
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Да вроде особо без проблем:


Снова не соблюдается пункт 3
Re: Опять кадровики "радуют"
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.11.18 19:27
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Итак, задача. Нужно развернуть массив (именно массив). Но:

CM>1. Сделать это при помощи рекурсии
CM>2. Таким образом, чтобы это можно было распараллелить
CM>3. Не использовать никакие разделяемые переменные

CM>Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл

CM>Кто-нибудь видит?

def rev(a):
    L = len(a)
    if L == 1:
        return a
    else:
        left = rev(a[L//2:])
        right = rev(a[:L//2])
        return left + right

data = [1,2,3,4,5]
print(rev(data))


1. Рекурсия есть
2. left и right можно вычислять параллельно
3. Разделяемых переменных нет

Скорее всего дико неэффективно, но эффективности никто вроде и не требовал
Re[8]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 19:27
Оценка:
Здравствуйте, Voivoid, Вы писали:

V> В моем примере нет конкурентного доступа к данным.


Каким образом нет, если он есть?

V>И, кроме того, если мы говорим про C++, то начиная с 11-го стандарта у языка появилась наконец-то своя модель памяти и если уж очень хочется, то вести обсуждение надо в её контексте.


Ну расскажи.
Re[2]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 15.11.18 19:28
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Может массив распределенный и лежит на нескольких машинах?


Про это не говорилось, но так это имело бы хоть какой-то смысл.
Re[9]: Опять кадровики "радуют"
От: Voivoid Россия  
Дата: 15.11.18 19:57
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, Voivoid, Вы писали:


V>> В моем примере нет конкурентного доступа к данным.


CM>Каким образом нет, если он есть?


Ну тогда наверное не затруднит его указать?
Re: Опять кадровики "радуют"
От: sr_dev  
Дата: 16.11.18 06:52
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Не вижу ни одного возможного решения, которое имело бы хоть какой-то смысл

CM>Кто-нибудь видит?

У меня возникла ассоциация с массивом который лежит в хдфс и цепочкой мап-редьюс задач для его обработки. На какую позицию спрашивают, чем заниматься предполагается?
Re[3]: Опять кадровики "радуют"
От: Muxa  
Дата: 16.11.18 09:44
Оценка:
RF>>Что такое распараллеливание?
КД>Сейчас, подожди. Я дискету отформатирую и покажу.
Эту шутку он не поймёт.
Re[2]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 16.11.18 15:30
Оценка:
Здравствуйте, sr_dev, Вы писали:

_>У меня возникла ассоциация с массивом который лежит в хдфс и цепочкой мап-редьюс задач для его обработки. На какую позицию спрашивают, чем заниматься предполагается?


Просто программер. Сайт для букинга.
Re[12]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 16.11.18 15:31
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Вопросов больше не имею


Я написал совершенно конкретно, в каких условиях возможно писать без блокировки и почему у тебя это невозможно.
Re[14]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 16.11.18 16:16
Оценка:
Здравствуйте, Muxa, Вы писали:

M>А это нарушение какого из трех пунктов?


Это нарушение пункта 0, который подразумевается: код должен работать.
Re[15]: Опять кадровики "радуют"
От: Muxa  
Дата: 17.11.18 07:26
Оценка:
M>>А это нарушение какого из трех пунктов?
CM>Это нарушение пункта 0, который подразумевается: код должен работать.
Даже если это псевдокод?
Re[16]: Опять кадровики "радуют"
От: CodeMonkey  
Дата: 17.11.18 15:27
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Даже если это псевдокод?


Если он некорректен — то даже в этом случае
Re[4]: Опять кадровики "радуют"
От: Hobbes Россия  
Дата: 19.11.18 19:05
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>а зачем его получать?:

BFE>
BFE>template <class T>
BFE>void Swap(T& l, T& r)
BFE>{
BFE>  T t = std::move(l);
BFE>  l = std::move(r);
BFE>  r = std::move(t);
BFE>}
BFE>


#include <algorithm>

std::swap(l, r);


Магия.
Отредактировано 19.11.2018 19:15 Hobbes . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.