Jiaolong's Blog Jiaolong's Blog
首页
分类
归档
Wiki
摘录
导航
留言
关于

Jiaolong

Solo Developer
首页
分类
归档
Wiki
摘录
导航
留言
关于
  • 在 Ubuntu 20.04 上安装 GCC
  • hello world
  • 使用cva6+spike搭建RISC-V环境
  • gcc编译过程查看汇编代码
  • 分析RISC-V汇编代码
  • RISC-V V扩展1.0版本环境搭建与测试
  • RISCV-V扩展执行速度测试
    • 测试函数
    • 主函数
    • 深度测试
  • 移植FFmpeg到RISC-V记录
  • Linux创建Swap交换分区
  • RISC-V \\V\\ Vector Extension 1.0 翻译
  • RISCV-V拓展1.0解读
  • 浅谈向量化和SIMD
  • x264编译测试
  • 浅淡Makefile
  • 回炉重造C语言
  • 使用Gprof+Gprod2dot做性能分析
  • 移植x264到RISC-V
  • QEMU运行RVV
  • 优化x264
  • 音视频理论基础
  • Swift拼音排序
  • Blog
Jiaolong
2022-08-29
Catelog

RISCV-V扩展执行速度测试

# 测试函数

测试函数为riscv-v1.0扩展官方文档

void saxpy_c(size_t n, const float a, const float *x, float *y)
{
        size_t i;
        for (i = 0; i < n; i++)
        {
                y[i] = a * x[i] + y[i];
        }
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

用汇编(v扩展)实现该函数saxpy.s

.global saxpy
saxpy:
        vsetvli a4, a0, e32, m8,ta,ma
        vle32.v v0, (a1)
        sub a0, a0, a4
        slli a4, a4, 2
        add a1, a1, a4
        vle32.v v8, (a2)
        vfmacc.vf v8, fa0, v0
        vse32.v v8, (a2)
        add a2, a2, a4
        bnez a0, saxpy
        ret
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13

# 主函数

  1. 普通实现

    #include <stddef.h>
    #include <stdio.h>
    #include <time.h>
    
    void saxpy_c(size_t n, const float a, const float *x, float *y)
    {
            size_t i;
            for (i = 0; i < n; i++)
            {
                    y[i] = a * x[i] + y[i];
            }
    }
    
    int main()
    {
            size_t size = 1000;
            const float a = 1.0;
            int loop = 1000;
            float array1[size];
            float array2[size];
    
            for (int i = 0; i < size; i++)
            {
                    array1[i] = i + 1;
                    array2[i] = i + 1;
            }
    
            clock_t start, end;
            double duration;
    
            start = clock();
            for (int i = 0; i < loop; i++)
                    saxpy_c(size, a, array1, array2);
            end = clock();
    
            printf("size: %d\n", size);
            printf("loop: %d\n", loop);
            printf("time: %dms\n", end - start);
    
            return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    分别使用x86的编译器和risc-v的编译器编译并执行,测试执行时间

    1. x86
    gcc callsaxpy.c -o test_x86
    
    1
    1
    ./test_x86
    
    1
    1

    1. riscv
    riscv64-unknown-elf-gcc callsaxpy.c -o test_rv
    
    1
    1
    spike --isa=RV64GCV pk test_rv
    
    1
    1

  2. riscv-v扩展实现

    #include <stddef.h>
    #include <stdio.h>
    #include <time.h>
    
    extern void saxpy(size_t n, const float a, const float *x, float *y);
    
    int main()
    {
    	size_t size = 1000;
    	const float a = 1.0;
    	int loop = 1000;
    	float array1[size];
    	float array2[size];
    
    	clock_t start, end;
    
    	for (int i = 0; i < size; i++)
    	{
    		array1[i] = i + 1;
    		array2[i] = i + 1;
    	}
    
    	//调用saxpy函数
    	start = clock();
    	for (int i = 0; i < loop; i++)
    		saxpy(size, a, array1, array2);
    	end = clock();
    
    	printf("size: %d\n", size);
    	printf("loop: %d\n", loop);
    	printf("time: %dms\n", end - start);
    
    	return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    spike --isa=RV64GCV pk test_rv_v
    
    1
    1

    aa.png

# 深度测试

分别对不同数据量(10、100、1000)进行测试,为突出效果,每次循环1000遍。

size=10 size=100 size=1000
x86 23ms 203ms 2052ms
RISCV 270ms 2430ms 24030ms
RISCV-V 24ms 54ms 334ms
Last updated: 2022/12/04, 13:58:10

← RISC-V V扩展1.0版本环境搭建与测试 移植FFmpeg到RISC-V记录→

Copyright © 2022-2023 | Jiaolong Wang
  • 跟随系统
  • 浅色模式
  • 深色模式