Некоторые __builtin_sin не работает

Я определил функцию

double builtin_test(double y)
{

double x = __builtin_sin(y);

return x;
}

думал, что это должно работать, но при компиляции

C: \ DOCUME ~ 1 \ ADMINI ~ 1 \ USTAWI ~ 1 \ Temp \ ccNuVeYz.o: test6.c :(. Text + 0x5): неопределенный ref
Отношение к греху

как заставить это работать?

-1

Решение

Это не ДЕЙСТВИТЕЛЬНО ответ (но вопрос также не совсем ясен) — просто слишком долго для комментария, и я не хочу связывать 2-3 комментария …

Важно понимать, что ОСНОВНАЯ причина __builtin_* Функция предназначена для поддержки того, что компилятор знает, как это сделать, а иногда это просто вызывает соответствующую стандартную библиотечную функцию, а не делает что-то особенное.

Если мы возьмем sin В качестве примера, в x87, есть fsin инструкция, которая может быть сгенерирована. Но если компилятор просто видит кучу математики, он не будет знать, что код делает sin, поэтому не будет производить fsin инструкции, просто сделайте кучу умножения, вычитания, сложения и т.д., чтобы выполнить этот расчет. Итак, используя __builtin_sin внутри стандартной библиотеки или заголовка, например, так:

double sin(double x)
{
return __builtin_sin(x);
}

будет генерировать fsin инструкция.

Я провел несколько экспериментов с gcc и clang на моей машине, и мне не удалось убедить компилятор действительно вычислить грех во время выполнения и НЕ вызывать sin функция. Clang-версия кода решила рассчитать стоимость всех моих циклов sin значения в константу — это, конечно, хорошая победа над выполнением 100 вычислений, но не совсем то, что мы ищем.

Обратите внимание, что fsin инструкция довольно медленная, и выполнение отдельных шагов вычисления с использованием простых инструкций может быть одинаково быстрым, но мы не хотим указывать это каждый раз sin используется (и, конечно, не хочу, чтобы компилятор «знал», как это сделать).

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector