Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
8fe739a87f | 1 year ago |
|
|
7742704b35 | 1 year ago |
@ -0,0 +1,46 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define SIZE 1024
|
||||
|
||||
// 向量加法函数
|
||||
void vector_add(float* A, float* B, float* C, int size) {
|
||||
for (int i = 0; i < size; ++i) { // 在循环内部声明i
|
||||
C[i] = A[i] + B[i];
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
// 定义向量
|
||||
float A[SIZE], B[SIZE], C[SIZE];
|
||||
|
||||
// 初始化随机数种子
|
||||
srand(time(0));
|
||||
|
||||
// 初始化向量 A 和 B
|
||||
for (int i = 0; i < SIZE; ++i) { // 在循环内部声明i
|
||||
A[i] = (float)(rand() % 100) / 100.0f; // 生成0到1之间的浮点数
|
||||
B[i] = (float)(rand() % 100) / 100.0f;
|
||||
}
|
||||
|
||||
// 多次执行以获得更准确的时间测量
|
||||
const int NUM_ITERATIONS = 1000;
|
||||
clock_t total_time = 0;
|
||||
for (int j = 0; j < NUM_ITERATIONS; ++j) {
|
||||
clock_t start = clock();
|
||||
vector_add(A, B, C, SIZE); // 执行向量加法
|
||||
clock_t end = clock();
|
||||
total_time += (end - start);
|
||||
}
|
||||
出平
|
||||
// 输均运行时间
|
||||
printf("基础向量加法平均运行时间: %.6f 秒\n", (double)total_time / (CLOCKS_PER_SEC * NUM_ITERATIONS));
|
||||
|
||||
// 可选:验证前几个元素的结果
|
||||
for (int k = 0; k < 5; ++k) {
|
||||
printf("A[%d] + B[%d] = C[%d]: %.2f + %.2f = %.2f\n", k, k, k, A[k], B[k], C[k]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,83 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <arm_neon.h> // 包含 NEON 头文件
|
||||
|
||||
#define SIZE 1024 // 定义向量大小
|
||||
#define ALIGNMENT 16 // NEON要求的数据对齐
|
||||
|
||||
// 基础向量加法函数
|
||||
void vector_add(float* A, float* B, float* C, int size) {
|
||||
for (int i = 0; i < size; ++i) {
|
||||
C[i] = A[i] + B[i];
|
||||
}
|
||||
}
|
||||
|
||||
// NEON 优化向量加法函数
|
||||
void vector_add_optimized(float* A, float* B, float* C, int size) {
|
||||
for (int i = 0; i <= size - 4; i += 4) { // 确保不会越界
|
||||
float32x4_t vecA = vld1q_f32(&A[i]);
|
||||
float32x4_t vecB = vld1q_f32(&B[i]);
|
||||
float32x4_t vecC = vaddq_f32(vecA, vecB);
|
||||
vst1q_f32(&C[i], vecC);
|
||||
}
|
||||
|
||||
// 处理剩余元素(如果 size 不是 4 的倍数)
|
||||
for (int i = size & ~3; i < size; ++i) { // 使用位操作确保从最近的4的倍数开始
|
||||
C[i] = A[i] + B[i];
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
// 检查是否支持NEON
|
||||
#if !defined(__ARM_NEON)
|
||||
printf("Error: This compiler does not support ARM NEON.\n");
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
// 定义并初始化对齐的向量
|
||||
float *A = (float *)aligned_alloc(ALIGNMENT, SIZE * sizeof(float));
|
||||
float *B = (float *)aligned_alloc(ALIGNMENT, SIZE * sizeof(float));
|
||||
float *C = (float *)aligned_alloc(ALIGNMENT, SIZE * sizeof(float));
|
||||
float *C_optimized = (float *)aligned_alloc(ALIGNMENT, SIZE * sizeof(float));
|
||||
|
||||
if (!A || !B || !C || !C_optimized) {
|
||||
printf("Memory allocation failed.\n");
|
||||
free(A); free(B); free(C); free(C_optimized);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 初始化随机数种子
|
||||
srand(time(0));
|
||||
|
||||
// 初始化向量 A 和 B
|
||||
for (int i = 0; i < SIZE; ++i) {
|
||||
A[i] = rand() % 100; // 生成 0 到 99 的随机数
|
||||
B[i] = rand() % 100;
|
||||
}
|
||||
|
||||
// 基础向量加法计时
|
||||
clock_t start = clock();
|
||||
vector_add(A, B, C, SIZE); // 执行基础向量加法
|
||||
clock_t end = clock();
|
||||
printf("基础向量加法运行时间: %.6f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
|
||||
|
||||
// NEON 优化向量加法计时
|
||||
start = clock();
|
||||
vector_add_optimized(A, B, C_optimized, SIZE); // 执行 NEON 优化向量加法
|
||||
end = clock();
|
||||
printf("NEON 优化向量加法运行时间: %.6f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
|
||||
|
||||
// 验证结果
|
||||
for (int i = 0; i < SIZE; ++i) {
|
||||
if (C[i] != C_optimized[i]) {
|
||||
printf("Results do not match at index %d: %f vs %f\n", i, C[i], C_optimized[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 释放内存
|
||||
free(A); free(B); free(C); free(C_optimized);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in new issue