Возможен ли пикосекундный таймер?

Данный

Я хочу сделать устройство, которое измеряет расстояние, основываясь на времени прохождения электромагнитной волны из одной точки (компьютер\микроконтроллер) в другую. Я не рассматриваю метод фазового сдвига для этого.

Я хочу сантиметровую точность (как минимум).

Для этого оба компьютера должны иметь часы с разрешением периода не менее 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 см).

Вы получите точные часы из цикла только в том случае, если это единственное, что делает ЦП, что очень маловероятно. Используйте аппаратный счетчик.

Weather Vane 22.07.2023 15:30

@WeatherVane, о процессоре у меня есть некоторые мысли по этому поводу. Будет идеально, если Вы сможете предоставить несколько микросхем счетчиков с частотой не менее 30 ГГц.

bcubeu26dncs 22.07.2023 15:32

Краткий ответ: нет, вы не можете со стандартными процессорами. Может быть, вы хотите изучить новейшую технологию микроэлектроники ST «Time of Flight»: st.com/en/imaging-and-photonics-solutions/…

Frankie_C 22.07.2023 15:36

@Frankie_C, было бы приятно прочитать Ваш полный ответ

bcubeu26dncs 22.07.2023 15:41

Аналоговые фазовые детекторы используются для измерения таких времен.

dimich 22.07.2023 15:41

@dimich, как я писал в начале поста, этот метод неприемлем

bcubeu26dncs 22.07.2023 15:47

Что ж, это может быть неприемлемо, но именно так это и делается, когда вы видите устройство, которое это делает. Вот почему лазерный измеритель не излучает невидимый пинг длительностью 1 нс (что было бы даже слишком долго, если бы идея заключалась в том, чтобы просто измерить, сколько раз требуется пройти до стены и вернуться к датчику).

chrslg 23.07.2023 01:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как уже отмечали другие, вы не можете ожидать, что какой-либо процессор завершит итерацию цикла за 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 22.07.2023 16:43

@bcubeu26dncs Если 9 женщин родили 9 детей за 9 месяцев, их производительность равна 1 ребенку в месяц. Но это не значит, что 9 женщин могут родить 1 ребенка за 1 месяц.

dimich 22.07.2023 16:48

1) Вы лучше в женщинах, чем в процессорах? Иначе я не понимаю, почему Вы использовали аналогию вместо прямого ответа. 2) Итак, из Вашей аналогии, как я понимаю, Вы имеете в виду, что я могу иметь желаемое количество инструкций в секунду за счет многопоточности? 3) Аргумент о многопоточности кажется неверным из-за Intel Core 2 Extreme X6800 (2-ядерный), который имеет 27 000 MIPS, т.е. 13 500 MIPS на ядро, что все еще слишком много и должно быть невозможно, по мнению Вас.

bcubeu26dncs 22.07.2023 17:09

@bcubeu26dncs Вам действительно нужно прочитать о многоскалярных и конвейерных процессорах и параллелизме на уровне инструкций (многопоточность не имеет к этому никакого отношения).

Employed Russian 22.07.2023 17:24

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

bcubeu26dncs 22.07.2023 17:33

@bcubeu26dncs: ЦП с частотой 5 ГГц имеет тактовый период 200 пс. Возможность запускать 4 инструкции за такт означает, что они происходят параллельно, перекрываясь в течение этих 200 пс, а не то, что они выполняются одна за другой, чтобы разделить этот тактовый период в 200 пс. (lightra.com/papers/modernmicroprocessors отлично). Кроме того, ввод-вывод занимает значительно больше времени, чем 1 такт, а rdtsc занимает около 20 тактов. Совершенно невозможно опрашивать контакт ввода-вывода даже один раз за 200 пс на современном x86, используя только инструкции ЦП.

Peter Cordes 22.07.2023 18:32

@PeterCordes, я думаю, что основная проблема в том, что операция увеличения не может быть распараллелена, насколько я понимаю, поэтому количество ядер не имеет никакого смысла, когда мне нужно увеличить одну и ту же переменную. Да, я читал о rdtsc, однако, если для его выполнения требуется постоянное время, я могу просто вычесть это значение. Но Вы также поправьте насчёт производительности ввода-вывода, однако, я думаю, что есть смысл её протестировать.

bcubeu26dncs 22.07.2023 19:02

@bcubeu26dncs: Правильно, несколько ядер не помогут. Но, как я уже сказал, несколько инструкций за такт на одном ядре тоже не помогут. На современных процессорах возможны две или три (кэшированные) загрузки за такт, но все они считывают кэш одновременно, а не 3 раза за такт. (Кэш L1d является многопортовым, поэтому параллельно могут выполняться 3 разных чтения.) Трафик вне ядра занимает намного больше времени. Да, вы могли бы, возможно, учесть большую часть изменчивости в rdtsc и прочем, но в лучшем случае у вас будет точность 200 пс на 5 ГГц i7. Вероятно, намного хуже из-за изменчивости кольцевой шины.

Peter Cordes 22.07.2023 20:18

Я думаю, что весь тред можно заархивировать на утверждение @PeterCordes, что в многоядерном случае инструкции выполняются одновременно в одно время, а не разделяют такт, что, вероятно, было моим заблуждением.

bcubeu26dncs 23.07.2023 16:02
Ответ принят как подходящий

Вы когда-нибудь посещали фабрику? Скажем, автомобильный завод.

Он проходит множество различных стадий. Одни рабочие красят кузов, потом он должен высохнуть, потом другие рабочие монтируют колеса, третьи добавляют сиденья и т.д. и т.п.

Для 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, даже если вы сможете учесть всю изменчивость времени ввода-вывода и выполнять ввод-вывод на частоте ядра ЦП.

На практике это было бы гораздо менее точным.

Другие вопросы по теме