Выключите сглаживание для шрифта в Emacs 23

Языки имеют подобные наборы функций. Различие в производительности прибывает из того, что Фортран говорит, что искажение не позволяется, если оператор EQUIVALENCE не используется. Любым кодом, который имеет искажение, не является допустимый Фортран, но это до программиста а не компилятора для обнаружения этих ошибок. Таким образом компиляторы Фортрана игнорируют возможное искажение указателей памяти и позволяют им генерировать более эффективный код. Смотрите на этот небольшой пример в C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Эта функция работала бы медленнее, чем дубликат Фортрана после оптимизации.Как же так? Если Вы пишете значения в выходной массив, можно изменить значения матрицы. В конце концов, указатели могли наложиться и указать на тот же блок памяти (включая int указатель!). Компилятор C вынужден перезагрузить четыре матричных значения из памяти для всех вычислений.

В Фортране компилятор может загрузить матричные значения однажды и сохранить их в регистрах. Это может сделать так, потому что компилятор Фортрана предполагает, что указатели/массивы не накладываются в памяти.

, К счастью, restrict ключевое слово и строгое искажение были представлены стандарту C99 для рассмотрения этой проблемы. Это хорошо поддерживается в большинстве компиляторов C++ в эти дни также. Ключевое слово позволяет Вам давать компилятору подсказку, что программист обещает, что указатель не искажает ни с каким другим указателем. Строгое искажение означает, что программист обещает, что указатели другого типа никогда не будут накладываться, например, double* не наложится с int* (за определенным исключением, которое char* и void* может наложиться с чем-либо).

при использовании их, Вы получите ту же скорость от C и Фортрана. Однако способность использовать restrict ключевое слово только с производительностью, критические функции означают, что C (и C++) программы намного более безопасны и легче записать. Например, рассмотрите недопустимый код Фортрана: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), который большинство компиляторов Фортрана счастливо скомпилирует без любого предупреждения, но представляет ошибку, которая только обнаруживается на некоторых компиляторах на некоторых аппаратных средствах и с некоторыми опциями оптимизации.

8
задан Vince 14 August 2009 в 20:04
поделиться