從多個方面詳解Coremark性能測試

一、Coremark簡介

Coremark是一個由EEMBC(嵌入式微處理器基準委員會)開發的綜合性測試,該測試可測量處理器的運行速度、內存速度、匯流排速度和I/O速度等因素。該測試與特定處理器器架構無關,在評估性能時更加客觀準確。

二、Coremark測試適用的處理器

Coremark性能測試適用於所有類型的處理器,包括微控制器、微處理器和單片機等。該測試覆蓋多個處理器的指令集和操作系統,並且可以在不同的編譯器和優化級別下進行測試。

三、Coremark測試優勢

Coremark測試具有以下優勢:

1、可被廣泛接受的基準測試。

2、代表綜合性能而不是單一特性。

3、足夠簡潔以進行常規測試。

4、容易比較結果和公開的表格。

四、Coremark測試原理

Coremark測試是由一系列作為基準的C程序構成的,這些程序涉及多個任務以測試處理器的性能和能力。測試結果是基於一個標準分數,可以比較不同處理器的實際性能。

五、Coremark測試應用

Coremark測試可用於以下應用方面:

1、處理器廠商進行處理器性能評估和優化。

2、系統開發者評估和優化系統性能。

3、處理器和系統選擇。

六、Coremark測試實例

下面是一個基本的Coremark測試C程序示例:

/* CoreMark test program */
/* Sponsored by CoreMark Committee and EEMBC */
/* Copyright (C) Embedded Microprocessor Benchmark Consortium (EEMBC)
 * and Performa SRL(a Silvaco company) 2010-2016. All rights are reserved.  */
/* Test application configuration */
#ifndef ITERATIONS
#define ITERATIONS 20000
#endif
#ifndef COMPILER
#define COMPILER "GCC"
#endif
#define UNUSED(x) (void)(x) /* for GNU */

/* Include files */
#include 
#include 
#include 
#include 
#include 

/* Local Constants */
#define VER "1.0.1"
#define MEM_STATIC 0
#define MEM_MALLOC 1
#define MEM_METHOD MEM_MALLOC
#define SEED_1 0x1234567L
#define SEED_2 0x56789ABL
#define SEED_3 0x9ABCDEF0L
#define UNROLL 8
#define COMPUTE_SIZE 1
#define MEM_SIZE ((size_t)1024*(size_t)8)
#define MAXBLOCKSIZE ((size_t)256)
#define C_ITERATIONS (ITERATIONS/UNROLL)

/* Local regression parameters */
#if defined(MEM_METHOD) && (MEM_METHOD==MEM_STATIC)
#define STATIC_PERFORMANCE_COPY_JPEG    "21.34"
#define STATIC_PERFORMANCE_DECODE_JPEG  "75.02"
#define STATIC_PERFORMANCE_UNPACK_TAR   "27.91"
#define STATIC_PERFORMANCE_GSM          "33.11"
#define STATIC_PERFORMANCE_CRC32        "57.68"
#define STATIC_PERFORMANCE_SHA          "57.67"
#endif

/* Local variables */
static int seed1 = SEED_1;
static int seed2 = SEED_2;
static int seed3 = SEED_3;
static size_t block_size = 0;
static size_t *memblock;
static size_t memblock_size = MEM_SIZE;

/* Data */
#include "data.h"

/* Local functions */
static double CoreMark_main(size_t value);
static unsigned int get_seed(unsigned int seed);

/* Local memory functions */
#if defined(MEM_METHOD) && (MEM_METHOD == MEM_MALLOC)
static void *portable_malloc(size_t size) { return malloc(size); }
static void portable_free(void *p) { free(p); }
#define MEM_METHOD_DESC "C library malloc/free"
#elif defined(MEM_METHOD) && (MEM_METHOD==MEM_STATIC)
#define MAX_MEMBLOCKS 10
static size_t static_memory[MAX_MEMBLOCKS][MEM_SIZE/sizeof(size_t)];
static size_t *static_memblock = static_memory[0];
static int next_memblock = 1;
static void *portable_malloc(size_t size) {
    void *p = NULL;
    if (size > MEM_SIZE)
        return NULL;
    if ((static_memblock-memblock)+size > MEM_SIZE) {
        if (next_memblock == MAX_MEMBLOCKS)
            return NULL;
        static_memblock = static_memory[next_memblock++];
    }
    p = static_memblock;
    static_memblock += size;
    return p;
}
static void portable_free(void *p) { UNUSED(p); return; }
#define MEM_METHOD_DESC "static array"
#elif defined(MEM_METHOD) && (MEM_METHOD==MEM_STACK)
/* This is to test stack allocation */
#define MEM_METHOD_DESC "stack area"
static void *portable_malloc(size_t size) { return NULL; }
static void portable_free(void *p) { UNUSED(p); return; }
#elif defined(MEM_METHOD) && (MEM_METHOD==MEM_LOCAL)
/* This is to test incorrect MADVISE settings, needs root privilege */
#define MEM_METHOD_DESC "local malloc/free"
static void *portable_malloc(size_t size) { return malloc(size); }
static void portable_free(void *p) { free(p); }
static void local_malloc_setup(void) {
#include 
#include 
    long i, pagesize = getpagesize();
    size_t maxsize = MEM_SIZE * MAXBLOCKSIZE / UNROLL;
    char *p = (char *)malloc(maxsize+pagesize);
    memblock = (size_t*)(p + pagesize - ((size_t)p % pagesize));
    for (i=0; i 3) {
        memblock[size-1] = seed1;
        memblock[size-2] = seed2;
        memblock[size-3] = seed3;
        size -= 3;
    }

#if (defined(MEM_METHOD) && (MEM_METHOD==MEM_STATIC))
    block_size = MAXBLOCKSIZE  MAXBLOCKSIZE)
        block_size = MAXBLOCKSIZE;
    while (block_size > 8 && (portable_malloc(block_size) == NULL))
        block_size -= 8;
    portable_free(memblock);
    memblock = NULL;
#else
    block_size = MAXBLOCKSIZE <= memblock_size/UNROLL ? MAXBLOCKSIZE : (memblock_size/UNROLL);
#endif
#endif
    /* Run the benchmark */
    final_score = CoreMark_main(block_size);

    /* Print the results */
    printf("CoreMark Size    : %zu\n", (size_t)(block_size*UNROLL));
    printf("Iterations/Sec   : %.2f\n", final_score);
    printf("Compiler   : %s\n", COMPILER);
#if defined(MEM_METHOD)
    printf("Memory     : %s %s\n",
        MEM_METHOD_DESC,
        MEM_METHOD==MEM_STATIC?"":(MEM_METHOD==MEM_LOCAL?"":(MEM_METHOD==MEM_STACK?"":"default C library")));
#endif
    printf("Seed       : %d,%d,%d\n", seed1, seed2, seed3);

    return 0;
}

七、總結

通過對Coremark的詳細闡述,我們了解到了Coremark測試的原理和應用場景,以及如何通過測試程序測試處理器的性能和能力。使用Coremark測試可以提高處理器的效率,選擇更好的系統和處理器,更好地滿足客戶和市場需求。

原創文章,作者:OIVYV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371156.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OIVYV的頭像OIVYV
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相關推薦

發表回復

登錄後才能評論