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