Данный
Я хочу сделать устройство, которое измеряет расстояние, основываясь на времени прохождения электромагнитной волны из одной точки (компьютер\микроконтроллер) в другую. Я не рассматриваю метод фазового сдвига для этого.
Я хочу сантиметровую точность (как минимум).
Для этого оба компьютера должны иметь часы с разрешением периода не менее 33,3 пс.
Если рассматривать часы как цикл счетчика, который просто увеличивает переменную uint64_t каждый раз, мне нужно, чтобы этот цикл выполнял каждую итерацию 30 миллиардов раз в секунду с паузой 33,3 пс.
Проблема
В этом вопросе комментаторы и ответивший пользователь утверждают, что производительность процессора ограничена его размерами из-за того, что информация не может распространяться быстрее скорости света. Это имеет смысл.
Мысли
Тем не менее, есть таблица миллионов инструкций процессоров в секунду.
Рассмотрим Intel Core i5-11600K: у него 6 ядер и 346 350 MIPS на частоте 4,92 ГГц. Очевидно, что 345 миллиардов инструкций предназначены для многопоточной программы (или даже нет?), однако на одно ядро должно приходиться 346/6 = 57 000 MIPS.
57 000 MIPS означает 57 миллиардов инструкций в секунду на одно ядро, а период равен примерно 17 пс.
Электромагнитная волна проходит 5 мм за 17 пс.
Threadreaper имеет 36 триллионов инструкций на ядро, что означает распространение волны 8 мкм вообще.
Так что по такой логике все это не должно работать, однако работает. В чем хитрость? Пикосекундный таймер еще возможен?
Если Вы собираетесь использовать многопоточность в качестве аргумента, пожалуйста, в таблице, которую я привел выше, посмотрите на Intel Core 2 Extreme X6800, который имеет всего 2 ядра и 27 000 MIPS, т.е. 13 500 MIPS на ядро, что все еще довольно быстро, и должно быть невозможно (свет пройдет всего 2,3 см).
@WeatherVane, о процессоре у меня есть некоторые мысли по этому поводу. Будет идеально, если Вы сможете предоставить несколько микросхем счетчиков с частотой не менее 30 ГГц.
Краткий ответ: нет, вы не можете со стандартными процессорами. Может быть, вы хотите изучить новейшую технологию микроэлектроники ST «Time of Flight»: st.com/en/imaging-and-photonics-solutions/…
@Frankie_C, было бы приятно прочитать Ваш полный ответ
Аналоговые фазовые детекторы используются для измерения таких времен.
@dimich, как я писал в начале поста, этот метод неприемлем
Что ж, это может быть неприемлемо, но именно так это и делается, когда вы видите устройство, которое это делает. Вот почему лазерный измеритель не излучает невидимый пинг длительностью 1 нс (что было бы даже слишком долго, если бы идея заключалась в том, чтобы просто измерить, сколько раз требуется пройти до стены и вернуться к датчику).





Как уже отмечали другие, вы не можете ожидать, что какой-либо процессор завершит итерацию цикла за 33 пикосекунды.
Чтобы решить вашу путаницу:
57 000 MIPS означает 57 миллиардов инструкций в секунду на одно ядро, а период равен примерно 17 пс.
57 000 MIPS не означает, что ЦП может выполнять 57e9 инструкций в секунду. MIPS в основном бессмысленен, потому что его производительность сравнивается с единицей VAX. IOW, ЦП может вывести из эксплуатации эквивалент 57 000 инструкций VAX в секунду.
Полезнее смотреть на часы. На частоте 5 ГГц один тактовый цикл занимает 200 пикосекунд, и ни одна инструкция на самом деле не занимает один тактовый цикл — все они занимают несколько (но из-за конвейерной обработки вы можете отказаться от одной инструкции/цикла).
Не могли бы вы добавить более подробную информацию о VAX и конвейерной обработке? Насколько я понимаю, MIPS относится к инструкциям ЦП, например PUSH или MOV. Если 57 миллиардов MIPS, т. е. MOV (например) инструкций действительно выполняются за 1 секунду, то утверждение о 5 ГГц и более одной инструкции в секунду неверно. Я понимаю, что некоторые инструкции действительно могут занимать более одного цикла
@bcubeu26dncs Если 9 женщин родили 9 детей за 9 месяцев, их производительность равна 1 ребенку в месяц. Но это не значит, что 9 женщин могут родить 1 ребенка за 1 месяц.
1) Вы лучше в женщинах, чем в процессорах? Иначе я не понимаю, почему Вы использовали аналогию вместо прямого ответа. 2) Итак, из Вашей аналогии, как я понимаю, Вы имеете в виду, что я могу иметь желаемое количество инструкций в секунду за счет многопоточности? 3) Аргумент о многопоточности кажется неверным из-за Intel Core 2 Extreme X6800 (2-ядерный), который имеет 27 000 MIPS, т.е. 13 500 MIPS на ядро, что все еще слишком много и должно быть невозможно, по мнению Вас.
@bcubeu26dncs Вам действительно нужно прочитать о многоскалярных и конвейерных процессорах и параллелизме на уровне инструкций (многопоточность не имеет к этому никакого отношения).
Что касается многопоточности, я предполагаю, что вы имели в виду свою аналогию, иначе это неправильно. Что касается Вы пишете сейчас, то я в этом не спец, но как я понимаю это означает, что ЦП может выполнять более 1 инструкции одновременно. В любом случае, я почитаю информацию о нем, спасибо
@bcubeu26dncs: ЦП с частотой 5 ГГц имеет тактовый период 200 пс. Возможность запускать 4 инструкции за такт означает, что они происходят параллельно, перекрываясь в течение этих 200 пс, а не то, что они выполняются одна за другой, чтобы разделить этот тактовый период в 200 пс. (lightra.com/papers/modernmicroprocessors отлично). Кроме того, ввод-вывод занимает значительно больше времени, чем 1 такт, а rdtsc занимает около 20 тактов. Совершенно невозможно опрашивать контакт ввода-вывода даже один раз за 200 пс на современном x86, используя только инструкции ЦП.
@PeterCordes, я думаю, что основная проблема в том, что операция увеличения не может быть распараллелена, насколько я понимаю, поэтому количество ядер не имеет никакого смысла, когда мне нужно увеличить одну и ту же переменную. Да, я читал о rdtsc, однако, если для его выполнения требуется постоянное время, я могу просто вычесть это значение. Но Вы также поправьте насчёт производительности ввода-вывода, однако, я думаю, что есть смысл её протестировать.
@bcubeu26dncs: Правильно, несколько ядер не помогут. Но, как я уже сказал, несколько инструкций за такт на одном ядре тоже не помогут. На современных процессорах возможны две или три (кэшированные) загрузки за такт, но все они считывают кэш одновременно, а не 3 раза за такт. (Кэш L1d является многопортовым, поэтому параллельно могут выполняться 3 разных чтения.) Трафик вне ядра занимает намного больше времени. Да, вы могли бы, возможно, учесть большую часть изменчивости в rdtsc и прочем, но в лучшем случае у вас будет точность 200 пс на 5 ГГц i7. Вероятно, намного хуже из-за изменчивости кольцевой шины.
Я думаю, что весь тред можно заархивировать на утверждение @PeterCordes, что в многоядерном случае инструкции выполняются одновременно в одно время, а не разделяют такт, что, вероятно, было моим заблуждением.
Вы когда-нибудь посещали фабрику? Скажем, автомобильный завод.
Он проходит множество различных стадий. Одни рабочие красят кузов, потом он должен высохнуть, потом другие рабочие монтируют колеса, третьи добавляют сиденья и т.д. и т.п.
Для Tesla (просто используйте этот пример, потому что данные общедоступны) требуется 12 недель, чтобы пройти весь процесс (12 недель проходит между моментом начала производства и моментом появления работающего автомобиля на заводе).
Тем не менее, Tesla производит 1000 автомобилей в день.
Было бы ошибкой сказать, что 1/(12*7)=0,0119 автомобилей в день. Или, наоборот, ожидать, что если завод выпускает 1000 автомобилей в день, значит, автомобиль собирается за 86,4 секунды.
И это не только из-за потоков или параллелизма. Точно так же на моих примерах можно было бы сказать: «Но завод не производит 1000 автомобилей в день, заводов Теслы больше одного». На самом деле их 6. Итак, 6 потоков, если хотите.
Тем не менее, было бы ошибкой сделать вывод, что для постройки Теслы требуется 518 секунд (86,4×6), а не 12 недель.
Это также из-за самого процесса: рабочий, который красит кузов, красит кузов второй машины, а другой рабочий устанавливает колеса первой машины. Автомобилю требуется время, чтобы пройти через всю цепочку. Вычисление 86400/1000*6 было бы верным только в том случае, если бы одновременно работал один рабочий (никто не занимается колесами, пока машину красят или пока она сохнет).
Итак, нет, вы не можете вывести длину инструкции из количества инструкций в секунду. Не более того, что вы можете вывести время, необходимое для создания Теслы (12 недель), из скорости, с которой заводы производят их (1000/6 в день и завод).
(Я мог бы использовать много других аналогий. Например, поскольку вы упоминаете распространение сигнала: вы можете знать, что электрону требуются часы, когда вы включаете свет, чтобы перейти от переключателя, который вы только что замкнут, к лампочке. Тем не менее, несколько квинтиллионов из них проходят через лампочку в секунду :D
ЦП с частотой 5 ГГц имеет тактовый период 200 пс. Одно ядро, способное выполнять от 4 до 6 инструкций за такт, означает, что они происходят параллельно, перекрываясь в течение этих 200 пс, а не то, что они выполняются одна за другой, чтобы разделить этот тактовый период в 200 пс. ( Современные микропроцессоры 90-минутное руководство! отлично подходит для знакомства с суперскалярными конвейерами ЦП).
(Несколько ядер тоже не помогают; их тактовые частоты не обязательно совпадают по фазе друг с другом или имеют одинаковую тактовую частоту, хотя клиентские (не серверные) процессоры Intel привязывают все ядра к одной и той же частоте, по крайней мере, для не-турбо. И они, безусловно, независимы друг от друга с точки зрения выполнения инструкций.)
На современных процессорах возможны две или три (кэшированные) загрузки за такт, но все они считывают кэш одновременно, а не 3 раза за такт. (Кэш L1d является многопортовым, поэтому одновременно с записью могут выполняться 3 разных чтения.) Трафик вне ядра занимает намного больше времени.
Кроме того, ввод-вывод занимает значительно больше времени, чем 1 такт. Совершенно невозможно опрашивать контакт ввода-вывода даже один раз за 200 пс на современном x86, используя только инструкции ЦП. Трафик между ядром и любым контактом ввода-вывода должен проходить по кольцевой шине, которая соединяет все ядра, контроллеры памяти и «системный агент» (где соединяются линии PCIe). Из-за конкуренции там может быть изменчивость задержки. А самые быстрые внечиповые соединения — это линии PCI-express, которые намного медленнее, чем 5 ГГц.
Возможно, вы можете учесть большую часть изменчивости в rdtsc и прочем (что занимает около 20 тактовых циклов), но в лучшем случае у вас будет точность 200 пс на 5 ГГц i7, даже если вы сможете учесть всю изменчивость времени ввода-вывода и выполнять ввод-вывод на частоте ядра ЦП.
На практике это было бы гораздо менее точным.
Вы получите точные часы из цикла только в том случае, если это единственное, что делает ЦП, что очень маловероятно. Используйте аппаратный счетчик.