Скорость операций с выровненными данными
Насколько мне известно, ЦП работает лучше всего с датумом, который выровнен по границе, равной размеру этого датума. Например, если каждый int
размер данных 4 байта, затем адрес каждого int
должно быть кратно 4, чтобы сделать процессор счастливым; то же самое с 2-байтовым short
данные и 8 байт double
данные. По этой причине, new
оператор и malloc
Функция всегда возвращает адрес, кратный 8 и, следовательно, кратный 4 и 2.
В моей программе некоторые критичные ко времени алгоритмы, предназначенные для обработки больших байтовых массивов, позволяют проходить вычисления путем преобразования каждого смежного 4 байта в unsigned int
и, таким образом, делать арифметику намного быстрее. Однако адрес байтового массива не обязательно должен быть кратным 4, потому что может потребоваться обработка только части байтового массива.
Насколько я знаю, процессоры Intel работают с некорректно выровненными данными, но за счет скорости. Если работа с выровненными данными происходит достаточно медленно, алгоритмы в моей программе должны быть переработаны. В связи с этим у меня есть два вопроса, первый из которых поддерживается следующим кодом:
// the address of array0 is a multiple of 4:
unsigned char* array0 = new unsigned char[4];
array0[0] = 0x00;
array0[1] = 0x11;
array0[2] = 0x22;
array0[3] = 0x33;
// the address of array1 is a multiple of 4 too:
unsigned char* array1 = new unsigned char[5];
array1[0] = 0x00;
array1[1] = 0x00;
array1[2] = 0x11;
array1[3] = 0x22;
array1[4] = 0x33;
// OP1: the address of the 1st operand is a multiple of 4,
// which is optimal for an unsigned int:
unsigned int anUInt0 = *((unsigned int*)array0) + 1234;
// OP2: the address of the 1st operand is not a multiple of 4:
unsigned int anUInt1 = *((unsigned int*)(array1 + 1)) + 1234;
Итак, вопросы:
Насколько медленнее OP2 по сравнению с OP1 на процессорах x86, x86-64 и Itanium (если не учитывать стоимость приведения типов и приращения адресов)?
При написании кросс-платформенного переносимого кода, о каких типах процессоров мне следует беспокоиться в связи с неправильным доступом к данным? (Я уже знаю о RISC)
1 ответ
На рынке слишком много процессоров, чтобы дать общий ответ. Единственное, что можно утверждать с уверенностью, - это то, что некоторые процессоры вообще не могут осуществлять доступ без выравнивания; это может иметь или не иметь значения для вас, если ваша программа предназначена для работы в однородной среде, например, Windows.
В современном быстродействующем процессоре скорость выравнивания доступа может быть больше затронута его выравниванием кэша, чем выравниванием адреса. На современных процессорах x86 размер строки кэша составляет 64 байта.
Есть статья в Википедии, которая может дать некоторые общие рекомендации: http://en.wikipedia.org/wiki/Data_structure_alignment