Скорость чтения ОЗУ на IPro c (ЦП на базе Cortex-A9) - PullRequest
0 голосов
/ 20 марта 2020

Уважаемые,

Я сделал простую тестовую программу для проверки скорости ОЗУ, особенно скорости чтения, на IPro c (одноядерный Cortex-A9). Я пробую два разных метода, чтобы прочитать область размером 4 МБ и измерить временные затраты:

1. Малло c (4 *1024* 1024)

2. mmap (через / dev / mem)

Результаты этих двух методов: 1. ~ 2200Mb / s 2. ~ 300Mb / s

Мой вопрос: почему стоимость времени отличается между этими двумя тестами? Что я знаю, так это то, что затраты времени должны быть одинаковыми, потому что размер доступа к программе одинаков. Но мои результаты отличаются от того, что я думал.

Спасибо, Алвис.

{

int
main(int argc, char* argv[])   
{
    struct timeval start, end;
    uint32_t* ptr;
    volatile uint32_t* iter;
    register uint32_t val = 0xabcdefef;
    int i, fd, sizeOfPtr = 1 * 1024 * 1024;
    unsigned char * map_base;  

    fd = open("/dev/mem", O_RDWR);
    if (fd == -1)  
    {  
        return (-1);  
    }  

    map_base = mmap(NULL, sizeOfPtr * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x7a000000);
    if (map_base == 0)  
    {  
        printf("NULL pointer!\n");  
    } 

    else  
    {  
        printf("Successfull!\n");  
    } 

    ptr = map_base;

    iter = ptr;

    gettimeofday(&start, NULL);
    for(i = 0; i < sizeOfPtr; i++)
    {
        val = *(iter + i);
    }
    gettimeofday(&end, NULL);

    munmap(map_base, sizeOfPtr * 4); 
    close(fd);

    printf("there is %d usecs passed read\n", (end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
    printf("%ld\n", CLOCKS_PER_SEC);


    ptr = malloc(sizeof(uint32_t) * sizeOfPtr);

    iter = ptr;

    gettimeofday(&start, NULL);
    for(i = 0; i < sizeOfPtr; i++)
    {
        val = *(iter + i);
    }
    gettimeofday(&end, NULL);

    if(ptr != NULL)
        free(ptr);

    printf("there is %d usecs passed read\n", (end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
    printf("%ld\n", CLOCKS_PER_SEC);

    return 0;
}

}

...