Я наблюдаю какое-то странное поведение, которое не могу объяснить. Ниже приведены подробности: -
#include <sched.h>
#include <sys/resource.h>
#include <time.h>
#include <iostream>
void memcpy_test() {
int size = 32*4;
char* src = new char[size];
char* dest = new char[size];
general_utility::ProcessTimer tmr;
unsigned int num_cpy = 1024*1024*16;
struct timespec start_time__, end_time__;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time__);
for(unsigned int i=0; i < num_cpy; ++i) {
__builtin_memcpy(dest, src, size);
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time__);
std::cout << "time = " << (double)(end_time__.tv_nsec - start_time__.tv_nsec)/num_cpy << std::endl;
delete [] src;
delete [] dest;
}
Когда я указываю -march=native в опциях компилятора, сгенерированный бинарник работает в 2,7 раза медленнее. Это почему ? Во всяком случае, я ожидаю, что -march=native создаст оптимизированный код. Существуют ли другие функции, которые могли бы показать этот тип поведения?
РЕДАКТИРОВАТЬ 1: Еще один интересный момент заключается в том, что если размер> 32 * 4, то нет разницы между временем выполнения генерируемых таким образом двоичных файлов.
РЕДАКТИРОВАТЬ 2: Ниже приведен подробный анализ производительности (__builtin_memcpy()): –
size = 32 * 4, без -march=native - 7,5 нс, с -march=native - 19,3
size = 32 * 8, без -march=native - 26,3 нс, с -march=native - 26,5
РЕДАКТИРОВАТЬ 3:
Это наблюдение не изменится, даже если я выделю int64_t/int32_t.
РЕДАКТИРОВАТЬ 4:
size = 8192, без -march=native ~ 2750 нс, с -march=native ~ 2750 (Ранее была ошибка в сообщении этого числа, ошибочно записывалось как 26,5, теперь правильно )
Я запускал их много раз, и цифры одинаковы для каждого запуска.
char
. AFAICT выровнены по байтам.__builtin_memcpy()
может быть оптимизирован для более высоких границ выравнивания под-march=native
на вашей платформе. Можете ли вы попробовать с массивамиint
илиlong
? - person Frédéric Hamidi   schedule 23.07.2011::operator new[]
? Зачем это делать? :) - person Frédéric Hamidi   schedule 23.07.2011no difference with or without -march=native
(проблема решена) илиno difference compared to the behavior with char
(возврат к исходной точке)? - person Frédéric Hamidi   schedule 23.07.2011