首页 > 其他分享 >c语言中调用sve函数的例子

c语言中调用sve函数的例子

时间:2023-02-10 22:13:47浏览次数:60  
标签:调用 time int pred sve 例子 ARRAYSIZE printf

c语言中调用sve函数 (Arm C Language Extensions for SVE)PDF
sve.c

#include <arm_sve.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRAYSIZE 102800000
int a[ARRAYSIZE];
int b[ARRAYSIZE];
int c[ARRAYSIZE];

int main() {
	srand((unsigned)time(NULL));
	for (int i = 0; i < ARRAYSIZE; i++)
	{
		// Generate a random number between 200 and 300
		a[i] = (rand() % 100) + 200;
		// Generate a random number between 0 and 100
		b[i] = rand() % 100;
	}
	int cnt = 0;
	clock_t start, finish;
	double Total_time;
	
	printf("\n");	
	start = clock();
    svbool_t pred = svptrue_b32();
    for (uint64_t i = 0; i < ARRAYSIZE; i += svcntw(), ++cnt)
    {
        svint32_t sva = svld1(pred, a + i);
        svint32_t svb = svld1(pred, b + i);
        svint32_t svc = svadd_s32_z(pred, sva, svb); 
        svst1(pred, c + i, svc);
    }
	finish = clock();
	Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算成秒
	// printf("i \ta[i] \tb[i] \tc[i] \n");
	// printf("=============================\n");
	// for (int i = 0; i < ARRAYSIZE; i++)
	// {
        // 	printf("%d \t%d \t%d \t%d\n", i, a[i], b[i], c[i]);
	// }
	printf("%f seconds\n", Total_time);
	// printf("svcntw() = %lu \t cnt = %d\n", svcntw(), cnt);
    return 0;
}

编译 gcc -O3 -march=armv8-a+sve -o sve sve.c
以长度为128的向量矢量寄存器运算

$ time armie -msve-vector-bits=128 ./sve

4.516719 seconds

real    0m4.586s
user    0m4.473s
sys     0m0.110s

以长度为2048的向量矢量寄存器运算

$ time armie -msve-vector-bits=2048 ./sve

0.598751 seconds

real    0m0.664s
user    0m0.568s
sys     0m0.093s

标签:调用,time,int,pred,sve,例子,ARRAYSIZE,printf
From: https://www.cnblogs.com/zkx98/p/17110381.html

相关文章