2009-09-23 10 views
4

При попытке выяснить, попадает ли внутренний цикл моего кода в барьер аппаратного дизайна или непонимание с моей стороны барьера. Там немного больше к этому, но самый простой вопрос, который я могу придумать, чтобы ответить следующим образом:Какова максимальная теоретическая скорость за счет SSE для простого двоичного вычитания?

Если у меня есть следующий код:

float px[32768],py[32768],pz[32768]; 
float xref, yref, zref, deltax, deltay, deltaz; 

initialize_with_random(px); 
initialize_with_random(py); 
initialize_with_random(pz); 

for(i=0;i<32768-1;i++) { 
    xref=px[i]; 
    yref=py[i]; 
    zref=pz[i]; 
    for(j=0;j<32768-1;j++ { 
    deltx=xref-px[j]; 
    delty=yref-py[j]; 
    deltz=zref-pz[j]; 
    } } 

Какой максимальной теоретической скорости до я был бы способный видеть, перейдя к инструкциям SSE в ситуации, когда у меня есть полный контроль над кодом (сборка, внутренняя обработка, что угодно), но не контроль над средой выполнения, отличной от архитектуры (т.е. это многопользовательская среда, поэтому я ничего не могу сделать как ядро ​​ОС назначает время для моего конкретного процесса).

Прямо сейчас я вижу ускорение 3x с моим кодом, когда я бы подумал, что использование SSE даст мне гораздо больше векторной глубины, чем указывает скорость 3 раза (предположительно, 3-кратная скорость говорит мне, что у меня есть максимальная теоретическая пропускная способность 4 раза). (Я пробовал такие вещи, как позволить deltx/delty/deltz быть массивами в случае, если компилятор не был достаточно умен, чтобы автоматически продвигать их, но я все еще вижу только 3-кратное ускорение.) Я использую компилятор Intel C с соответствующие флаги компилятора для векторизации, но, по-видимому, не имеют встроенных понятий.

+0

глупый вопрос, но удаляет ли «-1» из условий для чего-либо? (ваш цикл работает от 0 до 32766 вместо 32767) – Hasturkun

+0

Нет, это произвольное число.В текущем производственном коде это число будет переменной в любом случае. (Это означает, что в конечном итоге мне придется вручную развернуть цикл в регистры размером с регистром, которые, как я полагаю, и обрабатывать терминал с дополнительной логикой.) – 2009-09-23 16:31:20

ответ

4

Это зависит от процессора. Но теоретический максимум не будет превышать 4x. Я не знаю CPU, который может выполнять более одной инструкции SSE за такт, что означает, что он может не более вычислить 4 значения за цикл.

Большинство процессоров могут делать не менее одну скалярную инструкцию с плавающей запятой за цикл, поэтому в этом случае вы увидите теоретический максимум 4-кратного ускорения.

Но вам нужно будет найти конкретную пропускную способность для процессора, на котором вы работаете.

Практическое ускорение 3x довольно хорошо.

+0

Практическое ускорение выше 4x возможно _kind of_, по крайней мере в некоторых ситуациях и на некоторых моделях , У меня когда-то был процессор одного крупного производителя, который легко превосходил новую модель конкурента на 2 поколения по коду, которая делала значительное количество векторных и скалярных вычислений _both_ (со скромным давлением памяти). Оказалось, что на «более старом, медленном» процессоре код без SSE полностью выходил из строя и «бесплатно», пока выполнялся код SSE. Хотя это, по общему признанию, действительно особый случай, я бы предположил, что оптимизирующий компилятор может добиться подобного в малом масштабе. – Damon

2

Я думаю, вам, вероятно, придется каким-то образом перемежать внутренний контур. Трехкомпонентный вектор выполняется сразу, но это всего лишь три операции сразу. Чтобы добраться до 4, вы должны сделать 3 компонента из первого вектора и 1 из следующего, затем 2 и 2 и так далее. Если вы создали какую-то очередь, которая загружает и обрабатывает данные по 4 компонента за раз, затем отделяйте их после того, как это может сработать.

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

1

Рассмотрите: насколько широкий поплавок? Насколько широка инструкция SSEx? Соотношение должно дать вам некоторую разумную верхнюю границу.

Стоит также отметить, что нестандартные трубы играют в хавок с получением хороших оценок ускорения.

0

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