Как пройти собеседование?

Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Как пройти собеседование?

Post by Alexandr »

Я много занимался компьютерной графикой - а это та сфера, когда всегда не хватает процессора и памяти. На этапе проектирования очень сложно угадать, сколько потребует та или иная операция, нужно смотреть просто по факту. Конечно, многие вещи понятны и из общих соображений - например сдвиг дешевле умножения или деления, а ИЛИ дешевле суммы, но замеры показывают, что на современных компьютерах это не всегда заметно.
что касается графики и игры - это тот же самый жесткий сервер-сайд
Конечно, многие вещи понятны и из общих соображений - например сдвиг дешевле умножения или деления
ну да,
сдвиг - 1 такс
умножение - 3-11
целочисленное деление - > 40 8O :D
ИЛИ дешевле суммы
не дешевле: и то и то 1 такт
что на современных компьютерах это не всегда заметно
очень заметно, просто в современных стримовых процессорах выполнение блока команд - очень сильно зависит от того, где на разных этапах конвеера застреваем, начиная от декодера и заканчивая доступом к памяти
Глубину можно развить, конечно, но стратегически это тоже не всегда оправдано. Например, я эксперт в графических форматах. И кому это нужно? Я уже поработал в лидере рынка этой области. Эти знания уже можно выкинуть.
ну да, даже не знаю, кому это щас надо
вам видимо очень много пришлось работать с задачами по оптимизации памяти. Думаю, что много работали с собственными аллокаторами, локерами, оптимизировали разименования и сокращали обращение. Но если потеряете работу - кому это нужно? В 99% проектов на такие вещи можно забить или обойтись малой кровью.
я думаю, что на наше время сервер-сайда хватит, но я сам не уверен, что я до пенсии буду только им заниматься
все же хочется производить комплексные продукты, а не просто быть винтиком, поэтому многие вещи над которыми сейчас работаю включают и C++ на сервере и мейстрим на клиенте

вприцнипе, в фин секторе есть уже сформировавшаяся модель (в США) и активно формируемая - в Москве, где
back-end - linux С++ (где нужна скорость) + java (где скоростью можно пожертвовать)
font-end - C# + WPF либо вообще веб
ну и всякие там шины данных и прочая лабуда

так что не думаю, что с работой будут проблемы, хотя кто знает, как оно повернется
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Как пройти собеседование?

Post by Alexandr »

лично для себя я выбрал достаточную широту знаний без потери глубины
просто читать приходится не мало, особенно на стадии формирования компетенции ну и в разнородных проектах участвовать, пользовать что начитал так сказать
User avatar
Medium-rare
Уже с Приветом
Posts: 9195
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: Как пройти собеседование?

Post by Medium-rare »

OtherSide wrote: Мне не очень понятно, к чему вообще эти обсуждения? Я помню, очень любил их лет в 16-17, для того, что бы показать свою хацкерскую крутизну одноклассникам.
Но для людей с 10-20 годами программирования зачем это нужно? Если я увижу подобный код, я сразу распознаю его как ошибку и занесу в базу дефектов, даже если он не падает,
и так и задумано, ибо нефиг. И уж точно не буду задумываться - а вдруг будут портировать на экзотическую архитектуру и захотят написать обработчик прерывания деления на ноль, что тогда?
Говорил же, растёт спрос на тех, кто не зашорен текущей имплементацией ширпотребных компьютеров. В смысле, конечно, за ними и работать, но предметом, который программируем, может быть что угодно, вовсе не обязательно живущее по правилам современной IBM PC. Как бы, вопросы на интервью из категории: "Как хорошо понимаете разницу между правилами языка программирования и среды, в которой работает скомпиллированный код?".
... and even then it's rare that you'll be going there...
User avatar
Medium-rare
Уже с Приветом
Posts: 9195
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: Как пройти собеседование?

Post by Medium-rare »

Alexandr wrote:
The interrupt vector table starts at memory location 0000:0000h and ends at 0000:03FCh.
фигня, даже в реальном режиме таблица векторов прерываний находится там куда ссылается idtr - просто раньше этим мало кто заморачивался, а после reset он указывает на 0, поэтому и принято считать что в 0 начинается
Так есть и будет всегда! :D
... and even then it's rare that you'll be going there...
OtherSide
Уже с Приветом
Posts: 15929
Joined: 01 Mar 2008 15:14
Been thanked: 8 times

Re: Как пройти собеседование?

Post by OtherSide »

Сегодня вопрос на собеседовании задали: каков механизм инициализации статической переменной в функции? Говорят, что он thread-safe. Не могу понять, почему

Статичаеская переменная = экземпляр класса.
IvanF
Уже с Приветом
Posts: 719
Joined: 07 Jan 2011 20:58
Location: New York

Re: Как пройти собеседование?

Post by IvanF »

OtherSide wrote:Сегодня вопрос на собеседовании задали: каков механизм инициализации статической переменной в функции? Говорят, что он thread-safe. Не могу понять, почему

Статичаеская переменная = экземпляр класса.
Вы уверенны что правильно запомнили вопрос? Если да, то причем тут классы вообще? В общем случае инициализация статической переменной не thread-safe. Например MSVC++ генерирует код типа:

Code: Select all

if(b!=1)
{
  b = 1;
  //init static var
}

//==============================================
 __declspec(noinline) int t()
{
	static test_class c(2);
003E1000  mov         ecx,1  
003E1005  test        byte ptr [$S1 (3E3374h)],cl  
003E100B  jne         t+20h (3E1020h)  
003E100D  or          dword ptr [$S1 (3E3374h)],ecx  
003E1013  mov         eax,2  
	c.inc();
003E1018  add         eax,ecx  
003E101A  mov         dword ptr [c (3E3370h)],eax  
	return c.get_v();
}
003E101F  ret  
	c.inc();
003E1020  mov         eax,dword ptr [c (3E3370h)]  
003E1025  add         eax,ecx  
003E1027  mov         dword ptr [c (3E3370h)],eax  
	return c.get_v();
}
scorpion
Уже с Приветом
Posts: 3435
Joined: 16 Dec 2003 06:23
Location: SF Bay Area

Re: Как пройти собеседование?

Post by scorpion »

OtherSide wrote:Сегодня вопрос на собеседовании задали: каков механизм инициализации статической переменной в функции? Говорят, что он thread-safe.
http://blogs.msdn.com/b/oldnewthing/arc ... 85901.aspx
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Как пройти собеседование?

Post by Alexandr »

OtherSide wrote:Сегодня вопрос на собеседовании задали: каков механизм инициализации статической переменной в функции? Говорят, что он thread-safe. Не могу понять, почему

Статичаеская переменная = экземпляр класса.
цитата из стандарта:
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for
completion of the initialization. If control re-enters the declaration recursively while the variable is being initialized, the behavior is undefined.
[ Example:
int foo(int i) {
static int s = foo(2*i); // recursive call - undefined
return i+1;
}
—end example ]
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Как пройти собеседование?

Post by Alexandr »

scorpion wrote:
OtherSide wrote:Сегодня вопрос на собеседовании задали: каков механизм инициализации статической переменной в функции? Говорят, что он thread-safe.
http://blogs.msdn.com/b/oldnewthing/arc ... 85901.aspx
полезненько так :)
IvanF
Уже с Приветом
Posts: 719
Joined: 07 Jan 2011 20:58
Location: New York

Re: Как пройти собеседование?

Post by IvanF »

Кстати, а вот в GCC такая инициализация Thread safe потому что компилятор использует cxa_guard_acquire/cxa_guard_release для синхронизации.

Code: Select all

int t()
{
	static test_class c(2);
	static test_class c1(3);
	c.inc();
	return c.get_v();
}
//==========================
text:080484A0 ; t(void)
.text:080484A0                 public _Z1tv
.text:080484A0 _Z1tv           proc near               ; CODE XREF: main+6p
.text:080484A0                                         ; main+Bp
.text:080484A0
.text:080484A0 var_1C          = dword ptr -1Ch
.text:080484A0
.text:080484A0                 sub     esp, 1Ch
.text:080484A3                 cmp     byte ptr ds:_ZGVZ1tvE1c, 0 ; `guard variable for't(void)::c
.text:080484AA                 jz      short loc_80484F0
.text:080484AC
.text:080484AC loc_80484AC:                            ; CODE XREF: t(void)+5Ej
.text:080484AC                                         ; t(void)+76j
.text:080484AC                 cmp     byte ptr ds:_ZGVZ1tvE2c1, 0 ; `guard variable for't(void)::c1
.text:080484B3                 jz      short loc_80484C8
.text:080484B5
.text:080484B5 loc_80484B5:                            ; CODE XREF: t(void)+36j
.text:080484B5                                         ; t(void)+4Ej
.text:080484B5                 mov     eax, ds:_ZZ1tvE1c ; t(void)::c
.text:080484BA                 add     eax, 1
.text:080484BD                 mov     ds:_ZZ1tvE1c, eax ; t(void)::c
.text:080484C2                 add     esp, 1Ch
.text:080484C5                 retn
.text:080484C5 ; ---------------------------------------------------------------------------
.text:080484C6                 align 4
.text:080484C8
.text:080484C8 loc_80484C8:                            ; CODE XREF: t(void)+13j
.text:080484C8                 mov     [esp+1Ch+var_1C], offset _ZGVZ1tvE2c1 ; `guard variable for't(void)::c1
.text:080484CF                 call    ___cxa_guard_acquire
.text:080484D4                 test    eax, eax
.text:080484D6                 jz      short loc_80484B5
.text:080484D8                 mov     [esp+1Ch+var_1C], offset _ZGVZ1tvE2c1 ; `guard variable for't(void)::c1
.text:080484DF                 mov     ds:_ZZ1tvE2c1, 3 ; t(void)::c1
.text:080484E9                 call    ___cxa_guard_release
.text:080484EE                 jmp     short loc_80484B5
.text:080484F0 ; ---------------------------------------------------------------------------
.text:080484F0
.text:080484F0 loc_80484F0:                            ; CODE XREF: t(void)+Aj
.text:080484F0                 mov     [esp+1Ch+var_1C], offset _ZGVZ1tvE1c ; `guard variable for't(void)::c
.text:080484F7                 call    ___cxa_guard_acquire
.text:080484FC                 test    eax, eax
.text:080484FE                 jz      short loc_80484AC
.text:08048500                 mov     [esp+1Ch+var_1C], offset _ZGVZ1tvE1c ; `guard variable for't(void)::c
.text:08048507                 mov     ds:_ZZ1tvE1c, 2 ; t(void)::c
.text:08048511                 call    ___cxa_guard_release
.text:08048516                 jmp     short loc_80484AC
.text:08048516 _Z1tv           endp
.text:08048516
.text:08048516 ; ---------------------------------------------------------------------------
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: Как пройти собеседование?

Post by oshibka_residenta »

Alexandr wrote: вприцнипе, в фин секторе есть уже сформировавшаяся модель (в США) и активно формируемая - в Москве, где
back-end - linux С++ (где нужна скорость) + java (где скоростью можно пожертвовать)
font-end - C# + WPF либо вообще веб
ну и всякие там шины данных и прочая лабуда

так что не думаю, что с работой будут проблемы, хотя кто знает, как оно повернется
[offtop]
Признаю заранее, что про финансы ничего не знаю. Но из общих соображений кажется, что народ занимается ерундой.

Ну ладно, предположим, что для финансовых приложений ( и то, только если это high-frequency trade) нужна low-latency, так что это не очень scalable.
Но почему никто не сделает custom hardware решение на, скажем FPGA, которое будет, условно говоря, в 1000 раз быстрее? Вроде бы какие-то люди соединяли FPGA прямо к процессорой шине. После этого, казалось бы, можно сделать sofwаre в разы проще и дешевле.
Что я упустил? Или там ничего распараллелить нельзя?
[/offtop]
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Как пройти собеседование?

Post by Интеррапт »

IvanF wrote:Кстати, а вот в GCC такая инициализация Thread safe потому что компилятор использует cxa_guard_acquire/cxa_guard_release для синхронизации.
Да могли такой длинный ассемблерный код не постить :), т.к. эта фича GCC прописана в документации.
И отключается при помощи -fno-threadsafe-statics
IvanF
Уже с Приветом
Posts: 719
Joined: 07 Jan 2011 20:58
Location: New York

Re: Как пройти собеседование?

Post by IvanF »

Alexandr wrote:простой пример, если знать как работает paging unit в процессоре (в частности зачем TLB нужен), то сразу есть понимание, что обращаться к странице памяти, к которой до этого не обращался - стоит не так дешево (а еще tlb - это кеш, и соответственно обращаться с ним нужно как с кешем)
Однако какое у вас "глубокое" понимание...в том смысле что уж больно оно глубоко, что от нас не видно. А теперь расскажите там как вы в таком простом примере понимания работы paging unit в процессоре смогли РЕАЛЬНО с оптимизировать....да еще и на С++ :D. Желательно с цифрами....типа до оптимизации работало 60 секунд, а после оптимизации стало работать всего 1 минуту.
А если еще учесть глубину работы не специализированной OS типа Windows/Linux, то вообще непонятно как там можно что то с оптимизировать на уровне понимания paging unit в процессоре если в любой момент система вас может послать в вашим "пониманием" глубоко и на долго.
Даже Intel IPP с их супер ASM оптимизацией под каждый процессор в большинстве случаев не дает существенной прибавки в скорости.
На мой вгляд, прежде чем что то оптимизировать, надо сначала найти где происходит затык в скорости и уже потом работать в этом направлении. Т.е. не пытаться досканально оптимизировать каждую строчку исходя из своих "глубоких" знаний процессорной архитектуры, а наборот. Находить проблему, и потом изучая способы ее оптимизации уже углублять свои знания именно в той части, которая необходима для решения проблемы.
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: Как пройти собеседование?

Post by oshibka_residenta »

IvanF wrote:На мой вгляд, прежде чем что то оптимизировать, надо сначала найти где происходит затык в скорости и уже потом работать в этом направлении. Т.е. не пытаться досканально оптимизировать каждую строчку исходя из своих "глубоких" знаний процессорной архитектуры, а наборот. Находить проблему, и потом изучая способы ее оптимизации уже углублять свои знания именно в той части, которая необходима для решения проблемы.
+1
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Как пройти собеседование?

Post by Alexandr »

Признаю заранее, что про финансы ничего не знаю. Но из общих соображений кажется, что народ занимается ерундой.

Ну ладно, предположим, что для финансовых приложений ( и то, только если это high-frequency trade) нужна low-latency, так что это не очень scalable.
Но почему никто не сделает custom hardware решение на, скажем FPGA, которое будет, условно говоря, в 1000 раз быстрее? Вроде бы какие-то люди соединяли FPGA прямо к процессорой шине. После этого, казалось бы, можно сделать sofwаre в разы проще и дешевле.
Что я упустил? Или там ничего распараллелить нельзя?
и то, только если это high-frequency trade) нужна low-latency, так что это не очень scalable
ну так low latency и high thoughput - часто вещи взаимоисключающие
в трейдинге - первое
в веб-сервисах - второе
Но почему никто не сделает custom hardware решение на, скажем FPGA
уже есть такое: CUDA называется, на видео-карте считать всякое-разное

Return to “Работа и Карьера в IT”