Здесь развернутый цикл доступа в 64-битных чанках.Это может быть немного быстрее, чем простой цикл, но тестирование - единственный способ узнать.
Если предположить, что N кратно четырем, то sizeof (short) равен 16 битам и работает с 64-битными регистрамиработает.
typedef union u {
uint16_t us[4];
uint32_t ui[2];
uint64_t ull;
} u_t;
ushort_t src[N] = ...;
uint_t dst[N];
u_t *p_src = (u_t *) src;
u_t *p_dst = (u_t *) dst;
uint_t i;
u_t tmp, tmp2;
for(i=0; i<N/4; i++) {
tmp = p_src[i]; /* Read four shorts in one read access */
tmp2.ui[0] = tmp.us[0]; /* The union trick avoids complicated shifts that are furthermore dependent on endianness. */
tmp2.ui[1] = tmp.us[1]; /* The compiler should take care of optimal assembly decomposition. */
p_dst[2*i] = tmp2; /* Write the two first ints in one write access. */
tmp2.ui[0] = tmp.us[2];
tmp2.ui[1] = tmp.us[3];
p_dst[2*i+1] = tmp2; /* Write the 2 next ints in 1 write access. */
}
РЕДАКТИРОВАТЬ
Так что я только что проверил его на SUN M5000 (SPARC64 VII 2.5 ГГц) с GCC 3.4.1 в 64-битном режиме на4 000 000 элементов массива.Наивная реализация немного быстрее.Я пытался с SUNStudio 12 и с GCC 4.3, но я не смог даже скомпилировать программу из-за размера массива.
EDIT2
Мне удалосьскомпилируйте его сейчас на GCC 4.3.Оптимизированная версия немного быстрее, чем наивная.
GCC 3.4 GCC 4.3
naive 11.1 ms 11.8 ms
optimized 12.4 ms 10.0 ms
EDIT3
Мы можем сделать вывод, что в отношении C неВозникают проблемы с оптимизированной версией цикла копирования, поэтому выигрыш настолько низок, что риск ошибки перевешивает выгоду.