Спать без системных или IO звонков

Мне нужен режим сна, который не выдает никаких системных или IO-вызовов для сценария с аппаратной транзакционной памятью (эти вызовы могут привести к прерыванию). Спать в течение 1 микросекунды, как в usleep(1) было бы просто отлично.

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

Идея может состоять в том, чтобы вычислить сложное математическое уравнение. Есть ли подходы к этому? Фактическое время ожидания не должно быть точным - однако, оно должно быть примерно одинаковым для нескольких прогонов.

3 ответа

Решение

Попробуйте nop петля с летучим asm директива:

for (int i = 0; i < 1000; i++) { 
    asm volatile ("nop"); 
} 

Изменчивый должен препятствовать тому, чтобы оптимизатор избавился от этого. Если это не сработает, попробуйте __volatile__,

Вы можете использовать этот код:

#include <time.h>

void delay(int n)
{
    n *= CLOCKS_PER_SEC / 1000;
    clock_t t1 = clock();
    while (clock() <= t1 + n && clock() >= t1);
}

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

Обновить

Другой вариант - использовать такие петли с volatile счетчики.

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

Но если вы просто хотите цикл задержки, когда время не так важно, вам следует обратиться к программному коду. Например, есть специфичная для Intel встроенная функция, называемая _mm_pause это переводит на процессор pause инструкция, которая в основном останавливает конвейер до следующей синхронизации шины памяти. Он был разработан для помещения в цикл спин-блокировки (нет смысла вращать и запрашивать атомарную переменную до тех пор, пока не появится возможность получения новой информации), но он может (может - читать документацию) помешать компилятору удалить цикл задержки как пустой,

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