从多个方面详解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/n/371156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
OIVYVOIVYV
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相关推荐

  • 为什么Python不能编译?——从多个方面浅析原因和解决方法

    Python作为很多开发人员、数据科学家和计算机学习者的首选编程语言之一,受到了广泛关注和应用。但与之伴随的问题之一是Python不能编译,这给基于编译的开发和部署方式带来不少麻烦…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • 从多个方面用法介绍yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授权过程中,需要进行确认和配置级别控制的全能编程开发工程师。 一、授权确…

    编程 2025-04-29
  • 从多个方面zmjui

    zmjui是一个轻量级的前端UI框架,它实现了丰富的UI组件和实用的JS插件,让前端开发更加快速和高效。本文将从多个方面对zmjui做详细阐述,帮助读者深入了解zmjui,以便更好…

    编程 2025-04-28
  • 学Python用什么编辑器?——从多个方面评估各种Python编辑器

    选择一个适合自己的 Python 编辑器并不容易。除了我们开发的应用程序类型、我们面临的软件架构以及我们的编码技能之外,选择编辑器可能也是我们编写代码时最重要的决定之一。随着许多不…

    编程 2025-04-28
  • 使用easypoi创建多个动态表头

    本文将详细介绍如何使用easypoi创建多个动态表头,让表格更加灵活和具有可读性。 一、创建单个动态表头 easypoi是一个基于POI操作Excel的Java框架,支持通过注解的…

    编程 2025-04-28
  • 创建列表的多个方面

    本文将从多个方面对创建列表进行详细阐述。 一、列表基本概念 列表是一种数据结构,其中元素以线性方式组织,并且具有特殊的序列位置。该位置可以通过索引或一些其他方式进行访问。在编程中,…

    编程 2025-04-28
  • Python多个sheet表合并用法介绍

    本文将从多个方面对Python多个sheet表合并进行详细的阐述。 一、xlrd与xlwt模块的基础知识 xlrd与xlwt是Python中处理Excel文件的重要模块。xlrd模…

    编程 2025-04-27
  • 从多个角度用法介绍lower down

    lower down是一个常用于编程开发中的操作。它可以对某个值或变量进行降低精度的处理,非常适合于一些需要精度不高但速度快的场景。那么,在本文中,我们将从多个角度解析lower …

    编程 2025-04-27

发表回复

登录后才能评论