Перестановка переменных (C ++, уровень процессора) - PullRequest
9 голосов
/ 08 декабря 2011

Я хотел бы поменять местами две переменные. и я хотел бы сделать это через конвейер, используя опасность Read After Write для моего преимущества.

Pipeline:

OPERXXXXXX FetchXXXXX DecodeXXXX ExecuteXXX WriteBkXXX
STORE X, Y ---------- ---------- ---------- ----------
STORE Y, X STORE X, Y ---------- ---------- ----------
---------- STORE Y, X STORE X, Y ---------- ----------
---------- ---------- STORE Y, X STORE X, Y ----------
---------- ---------- ---------- STORE Y, X STORE X, Y
---------- ---------- ---------- ---------- STORE Y, X

как мне сказать компилятору сделать это (и именно это) без автоматических блокировок и предупреждающих флагов? Можете ли вы предложить какую-либо литературу / ключевые слова?

характеристики:

  • -> target: современные архитектуры, поддерживающие конвейерную передачу нескольких станций (более 4)

  • -> это не связано с какой-либо конкретной «проблемой». просто ради науки.

текущие препятствия:

  • если вы знаете, как игнорировать угрозы для данных, поделитесь.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Предлагаю прочитать первые части Руководства по оптимизации Intel .Тогда вы поймете, что современный, не по порядку, спекулятивный процессор даже не уважает ваш язык ассемблера.Манипулирование трубопроводом в ваших интересах?Основываясь на этом документе, я бы сказал - забудь об этом.

0 голосов
/ 09 декабря 2011

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

В общем, процессор будет делать все возможное, чтобы притвориться, что все выполняется по порядку, даже если в действительности он суперскалярный за кулисами.Код, который пытается использовать преимущества опасностей, не ломается, но вместо этого он выполняется медленнее, так как процессор будет ждать, пока опасность не исчезнет, ​​прежде чем продолжить.В противном случае почти весь код будет сбоить в будущих поколениях ЦП при увеличении суперскалярного поведения.

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

...