Рекомендации по использованию __builtin_expect

Что мне следует обернуть с помощью макросов gcc __builtin_expected в if с несколькими и вложенными тестами? У меня есть этот код:

if((x<RADIUS && (forward?v<0:v>0)) || (x+RADIUS>dimensions[d] && (forward?v>0:v<0)))

Я (смешно) обернул все, что мог:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
if(unlikely(unlikely(unlikely(x<RADIUS) && likely(likely(forward)?likely(v<0):likely(v>0))) || unlikely(unlikely(x+RADIUS>dimensions[d]) && likely(likely(forward)?likely(v>0):likely(v<0)))))

Я надеюсь, что это просто перебор, потому что он довольно нечитабелен.

4
25 мая '12 в 14:16
источник поделиться
1 ответ

Я не думаю, что здесь есть неправильный ответ. Компилятор будет использовать ваши подсказки, чтобы решить, в каком случае сделать "else" случай каждого сравнения; что не только код C else, но и внутри ands и ors логики, и чем больше информации, тем лучше.

Для читаемого кода я бы предложил сохранить его в большом материале: один раз для каждого оператора if, но это не основано на каких-либо твердых доказательствах.

Считаете ли вы использование -fprofile-generate, запустите код с типичными данными, а затем перестройте с помощью -fprofile-use? Таким образом, компилятор может создать свою собственную картинку для всех этих случаев. Это более переносимо (без аннотаций, специфичных для компилятора), более читаемым и более надежным в будущем.

4
25 мая '12 в 16:57
источник

Посмотрите другие вопросы по меткам или Задайте вопрос