Compare commits

...

3 Commits
main ... 333

@ -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,85 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1024 // 定义矩阵大小
#define ALIGNMENT 64 // 对齐大小
// 动态分配对齐的二维数组
float** allocate_2d_array(int rows, int cols) {
float** array = (float**)malloc(rows * sizeof(float*));
if (!array) {
fprintf(stderr, "Memory allocation failed for 2D array.\n");
exit(EXIT_FAILURE);
}
for (int i = 0; i < rows; ++i) {
array[i] = (float*)aligned_alloc(ALIGNMENT, cols * sizeof(float));
if (!array[i]) {
fprintf(stderr, "Memory allocation failed for row %d.\n", i);
// 释放已经分配的内存
for (int j = 0; j < i; ++j) {
free(array[j]);
}
free(array);
exit(EXIT_FAILURE);
}
}
return array;
}
// 释放二维数组
void free_2d_array(float** array, int rows) {
for (int i = 0; i < rows; ++i) {
free(array[i]);
}
free(array);
}
// 矩阵乘法函数
void matmul(float** A, float** B, float** C, int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
C[i][j] = 0; // 初始化 C[i][j]
for (int k = 0; k < n; ++k) {
C[i][j] += A[i][k] * B[k][j]; // 逐项累加计算结果
}
}
}
}
int main() {
// 动态分配矩阵 A、B、C 的内存
float** A = allocate_2d_array(SIZE, SIZE);
float** B = allocate_2d_array(SIZE, SIZE);
float** C = allocate_2d_array(SIZE, SIZE);
// 初始化矩阵 A 和 B 的元素
srand(time(0));
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
A[i][j] = rand() % 100; // 生成 0 到 99 的随机数
B[i][j] = rand() % 100;
}
}
// 多次执行以获得更准确的时间测量
const int NUM_ITERATIONS = 10;
clock_t total_time = 0;
for (int iter = 0; iter < NUM_ITERATIONS; ++iter) {
clock_t start = clock();
matmul(A, B, C, SIZE); // 执行矩阵乘法
clock_t end = clock();
total_time += (end - start);
}
// 输出平均运行时间
printf("基础矩阵乘法平均运行时间: %.6f 秒\n", (double)total_time / (CLOCKS_PER_SEC * NUM_ITERATIONS));
// 释放矩阵 A、B、C 的内存
free_2d_array(A, SIZE);
free_2d_array(B, SIZE);
free_2d_array(C, SIZE);
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…
Cancel
Save