2013-08-11 2 views
0

Я работаю над оптимизацией параллельных алгоритмов (разреженной матрицей) и работает над блокировкой регистра. Я хочу найти число и тип регистров (в частности, регистры с плавающей запятой, а затем другие), доступные в машине. Чтобы настроить мой код на основе доступных регистров и сделать его независимым от платформы. Есть ли способ сделать это в C++?найти число регистров с плавающей запятой programmaticaly в C++

спасибо. mjr

+3

Не в переносном C или C++ - они даже не определяют, что такое ЦП, не говоря уже о регистре. Вы можете найти библиотеку или вызовы, специфичные для ОС, для получения этой информации, но звучит так, будто вам лучше создавать исполняемые файлы для ОС и чипов. – Mat

+0

@mat что вы используете в портативных c или C++? Знаете ли вы какую-нибудь библиотеку? – mjr

+1

C или C++ код, который использует только конструкции, определенные в их соответствующих стандартах, и не полагается на какие-либо трюки, специфичные для реализации. – Mat

ответ

3

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

Поскольку запись кода ассемблера очень неспортивна, я не думаю, что это считается решением для оптимизации кода с использованием знаний о том, сколько регистров и т. Д. Очень сложно знать, как компилятор использует регистры. Если у вас есть int x = y + z; в качестве простого примера, сколько регистров требуется? Зависит от компилятора - он может использовать ни один, один, два, три, четыре, пять или шесть, не будучи ниже оптимального использования регистров - все зависит от того, как компилятор решает разобраться с вещами, машинной архитектурой, где/сохраняются и т. д. Тот же принцип применяется к числу регистров с плавающей запятой, если мы изменим int на double. Нет очевидного способа рассказать, сколько регистров используется в этом заявлении (хотя я подозреваю не более трех, однако он может быть равен нулю или одному, в зависимости от того, что решает компилятор).

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

+0

Если я хорошо вас понимаю, из-за техники компилятора, такой как регистрация переименования регистров или регистр разлива в слот стека, мы не можем узнать, сколько регистров будет использовано для expersion (s). Но если мы знаем, что для наших выходов требуется 7 регистров или 13 регистров в нормальном состоянии на машине с 8 или 16 регистрами, не останавливайте CPU от регистра разлива и остановите замедление цикла, выполняющего разворот (ы). – mjr

+0

Термин «переименование регистров» в моем словаре означает, что процессор имеет физически больше регистров, чем «показывает» - например, Процессоры x86 официально имеют 8 регистров, но я знаю, что некоторое время назад внутри процессоров AMD было встроено 32 регистра. Но да, компилятор может использовать более или менее регистры, чем вы «ожидаете», и может использовать регистры более или менее умно в зависимости от того, как он решает иметь дело с определенным выражением (например,загрузите значение в регистр, затем добавьте ко второму регистру или используйте команду добавления с операндом косвенной памяти). Он может выбирать по-разному в разное время. –

2

Я боюсь, что нет простого переносного решения.

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

Другим подходом является автоматическая настройка исходного кода на основе результатов некоторых эталонных тестов. Это то, что делает Automatically Tuned Linear Algebra Software (ATLAS).

Смежные вопросы