2013-11-13 12 views
17

Насколько я могу судить, аппаратные предварительные считыватели будут, по крайней мере, обнаруживать и получать постоянные шаги через память. Кроме того, он может monitor data access patterns, что бы это ни значило. Что привело меня к удивлению, ли предварительные данные аппаратного обеспечения когда-либо основывали свои решения на фактических данных, хранящихся в памяти, или на основе поведения, которое демонстрирует программа?Могут ли «неродные» указатели повредить производительность кеша?

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

Но, насколько я знаю, это может помешать работе аппаратных префишеров. Или нет!

Я могу себе представить, реалистичный или нет, блок предварительной выборки, который анализирует строки кэша, которые входят в кеш-память L1 для собственных указателей-указателей и запускает их выборку в L2 или какую-то такую ​​вещь. В этом случае мой умный трюк экономии памяти внезапно кажется менее решительным.

Итак, что делают современные аппаратные prefetchers, действительно? Могут ли они быть сработаны «неродными» указателями?

+0

Я может звучать глупо, но то, что это не родной указатель? – Alex

+0

В этом вопросе «родной» указатель должен быть значением, которое хранит адрес памяти в буквальном смысле. '0x1234' будет указывать на память на' 0x1234'. «Неродный» указатель будет значением, которое косвенно относится к памяти. '0x1234' в этом контексте может ссылаться на память на' some_array [0x1234] 'или что-то более сложное, например' array = some_map [0x1234 >> 8]; pointer = array [0x1234 & 0xff] '. – porgarmingduod

ответ

10

Предварительная выборка связанных структур данных (LDS) по-прежнему является известной проблемой в компьютерной архитектуре. Я не знаком с каким-либо современным процессором, который на самом деле это делает, но теоретически это возможно. Там было несколько статей академии на протяжении многих лет, которые предлагают некоторые вариации в течение:

  1. Выделенный HW, который может определять адреса типа значения в пределах принесенных строк кэша, и выдавать предварительную выборку по этим адресам.
  2. Техника, основанная на компиляторе, где компилятор распознает зависимости структуры данных и вставляет предварительные выборки или другие подсказки.

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

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

Кстати, обратите внимание, что даже если HW видит содержимое памяти, он все еще находится в виртуальном адресном пространстве - HW все равно должен будет сделать какой-то перевод на физический адрес, чтобы использовать его, поэтому в смысла там не должно быть никаких дополнительных накладных расходов.

Некоторые библиография:

+1

Принимая это, поскольку он наиболее непосредственно отвечает на вопрос: Нет, в настоящее время нет известного процессора, который делает предварительную выборку на основе связанных данных. – porgarmingduod

+0

Ну, если я когда-нибудь закончу диссертацию, я посмотрю, смогу ли я продать его Intel/AMD/.., и, может быть, когда-нибудь будет один :) – Leeor

21

Аппаратный предварительный выборщик не видит указателей, он видит адреса памяти. Не важно, откуда пришел адрес, или какой тип он имел в написанной вами программе на C++. Он просто смотрит, на какой адрес процессор сказывается, чтобы читать или писать.

Так что нет, индексирование в массив не будет пугающей новой вещью, с которой CPU никогда не сталкивался раньше.

+3

Точно. Не думайте с точки зрения * типов *, пытаясь понять возможности процессора. –

+0

Это не совсем точный, теоретический будущий процессор может решить предварительно запрограммировать данные на основе данных, такие методы были предложены в академии – Leeor

+2

@MarcClaesen: хорошо, чтобы быть честным с OP, даже с точки зрения представления ЦП существует разница между как представляется адрес памяти (8 байтов на 64 бит) и как представляется смещение от «известного» адреса (возможно, только 2 байта, если этого достаточно). Предлагаемая «новомодная» оптимизация предварительной выборки памяти на любом месте, похожем на адрес памяти в кеше L1, кажется совершенно легитимной, например, и будет раздавлена ​​смещением «экономии памяти». –

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