2014-09-21 1 views
1

Как выполнить деление И одновременно в модуле. Возможно ли это для процессора?Каков наилучший способ выполнения разделения и модуляции для процессора?

Как:

int a, b = 8/3; //a = 2, b = 2 

Или есть операция, которая лучше, чем:

int a = 8/3; 
int b = 8 % 3; 

Может быть, это лучше?

int a = 8/3; 
int b = 8 - a * 3; 

Спасибо.

+1

http://stackoverflow.com/questions/5608559/division-and-modulus-using-single-divl-instruction-i386-amd64 может представлять интерес. –

+0

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

+0

Возможно, процессор может иметь инструкцию , Существует много разных процессоров, которые имеют разные возможности. У 6502 нет даже деления (или умножения, если на то пошло). – molbdnilo

ответ

6

Рассмотрим следующую функцию:

std::pair<int, int> divmod(int x, int y) 
{ 
    return { x/y, x % y }; 
} 

Compiling это с g++ -std=c++11 -O1 -S выкладывает следующий код сборки:

movl %edi, %eax 
cltd 
idivl %esi 
salq $32, %rdx 
movl %eax, %eax 
orq  %rdx, %rax 
ret 

Как вы можете видеть, он содержит только одно деление на линии 3. оптимизаторы очень хороши в этом.

+0

Отличный материал! Более того, компилятор также заменит '% y' ->' & (y-1) 'и'/y' '' log2 (y) ', если' y' является степенью двух. Не нужно беспокоиться о таких микро-оптимизации и просто писать наиболее выразительный код. – TemplateRex

5

Возможно, это лучше?

Зачем это было? Это неясно, как программисту, так и компилятору/оптимизатору. Не смотря на вывод компилятора, я бы предположил, что любой достойный оптимизатор видит ваш первый код и говорит «ah, div и модем, я бы лучше выбрал divmod opcode». В то время как во втором случае оптимизатор вполне в праве пожать плечами и оставить его на этом.

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


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

+0

+1.Наиболее распространенными оптимизаторами являются оптимизаторы голосовой почты, потому что они настолько просты. Это всего лишь набор правил в форме «Если вы видите шаблон« XYZ », замените последовательность инструкций' AB'. В частности, существует конечный набор общих шаблонов 'XYZ'. 'a/b, a% b' - общий шаблон,' a/b, a - (a/b) * b' не является. – MSalters

1

Возможно, вы создаете решение какой-либо проблемы, связанной с тем, что <cstdlib> имеет значение std::div.

namespace std 
{ 

struct div_t 
{ 
    int quot; 
    int rem; 
}; 
struct ldiv_t 
{ 
    long int quot; 
    long int rem; 
}; 
struct lldiv_t 
{ 
    long long int quot; 
    long long int rem; 
}; 

    div_t div (int numer, int denom); 
ldiv_t div (long int numer, long int denom); 
lldiv_t div (long long int numer, long long int denom); 

}; // namespace std 

http://www.cplusplus.com/reference/cstdlib/div/

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

  • Нет связанных вопросов^_^