Коллеги , а что вы не юзаете тот же интеловский компилятор, он то именно
на такой синтетики должен давать максимальные результаты.
On 02/10/2015 04:33 PM, Andrey Kovbovich wrote:
Потестил на более менее современной тачке... вариант Монса у меня
сегфолтится почему-то, прогнал слегка модифицированный из пред комментов
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
int main()
{
uint32_t *arr;
arr = (uint32_t *) malloc(10000000 * sizeof(uint32_t));
int i,z;
for( i=0; i<10000000; i++) {
arr[i] = i;
}
clock_t start = clock();
uint64_t sum;
for(z = 0; z < 100; z++ ){
sum = 0;
for( i=0; i<10000000; i++) {
sum+=arr[i];
}
}
clock_t end = clock();
printf("Time:(%0.8f)ms . Sum: %" PRIu64,
((double)end-start)*1000/CLOCKS_PER_SEC/z, sum);
return 0;
}
$ cat /proc/cpuinfo
model name: Intel(R) Core(TM) i7 CPU X 980 @ 3.33GHz
$ gcc --std=c99 -O3 -march=native 3.c -o 3.native
$ ./3.native
Time:(5.20000000)ms . Sum: 49999995000000$
еще раз на скриптовом J
$ ./jconsole.sh
x =: i.10000000
6!:2 's =: +/x'
0.009537
s
49999995000000
9+ ms
10 февраля 2015 г., 14:48 пользователь Анатолий Гришаев
<[email protected] <mailto:[email protected]>> написал:
10.02.2015 14:36, Михаил Монашёв пишет:
Здравствуйте, Анатолий.
Кстати лучше считать с нуля тогда процесор может
использовать
prefetch
Ещё в С можно как-то задать выравнивание массива. Не знаю,
правда,
поможет ли это, но мне кажется, что всё упирается в скорость
чтения из
памяти. Ещё возможно попытаться задать выравнивание для тела
цикла.
В POSIX написано, что результат вызова malloc всегда выровнен, а
всякие массивы объявленные статично компилятор выравнивает.
Можно поэтому не волноваться :)
Конечно, если ты сам адрес массива не посчитаешь/укажешь типа
0x...7f.
--
Moscow.pm mailing list
[email protected] <mailto:[email protected]> | http://moscow.pm.org
--
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org