__builtin_prefetch, сколько он читает?

Я пытаюсь оптимизировать код RCC4 GCC С++ с помощью

__builtin_prefetch

У меня возникли проблемы с попыткой выяснить, как префикс целого класса. Я не понимаю, сколько из const void *addr читается. Таким образом, я загружаю следующие значения from и to.

for (int i = from; i < to; i++)
{
    double kv = myLinks[i].kv;
    particle* from = con[i].Pfrom;
    particle* to = con[i].Pto;
    //Prefetch values at con[i++].Pfrom & con[i].Pto;
    double pos = to->px- from->px;
    double delta = from->r + to->r - pos;
    double k1 = axcel(kv, delta, from->mass) * dt; //axcel is an inlined function
    double k2 = axcel(kv, delta + 0.5 * k1, from->mass) * dt;
    double k3 = axcel(kv, delta + 0.5 * k2, from->mass) * dt;
    double k4 = axcel(kv, delta + k3, from->mass) * dt;
    #define likely(x)       __builtin_expect((x),1)
    if (likely(!from->bc))
    {
            from->x += (( k1 + 2 * k2 + 2 * k3 + k4) / 6);
    }
}

Ссылка: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

Ответ 1

Я думаю, что он просто испускает одну машинную инструкцию FETCH, которая в основном извлекает кеш-строку, размер которой зависит от процессора.

И вы можете использовать __builtin_prefetch (con[i+3].Pfrom), например. По моему (маленькому) опыту, в таком цикле лучше предварительно предварительно выбрать несколько элементов.

Не используйте __builtin_prefetch слишком часто (т.е. не ставьте много из них внутри цикла). Измерить прирост производительности, если они вам нужны, и использовать оптимизацию GCC (не менее -O2). Если вам повезет, руководство __builtin_prefetch может увеличить производительность вашего цикла на 10 или 20% (но это также может повредить).

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

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


(добавлено в январе 2018 года:)

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

Ответ 2

Он читает строку кэша. Размер строки кэша может отличаться, но, скорее всего, это 64 байта на современных процессорах. Если вам нужно прочитать несколько строк кеша, посмотрите prefetch_range.