You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
7.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ctime.h"
int main() {
// 为向量a分配内存空间大小为VECTOR_SIZE个float类型元素所占的空间
float* a = (float*)malloc(VECTOR_SIZE * sizeof(float));
// 为向量b分配内存空间大小为VECTOR_SIZE个float类型元素所占的空间
float* b = (float*)malloc(VECTOR_SIZE * sizeof(float));
// 为基础向量加法结果向量分配内存空间大小为VECTOR_SIZE个float类型元素所占的空间
float* resultVectorBase = (float*)malloc(VECTOR_SIZE * sizeof(float));
// 为NEON优化向量加法结果向量分配内存空间大小为VECTOR_SIZE个float类型元素所占的空间
float* resultVectorNeon = (float*)malloc(VECTOR_SIZE * sizeof(float));
// 为矩阵A分配内存空间大小为MATRIX_SIZE * MATRIX_SIZE个float类型元素所占的空间
float* A = (float*)malloc(MATRIX_SIZE * MATRIX_SIZE * sizeof(float));
// 为矩阵B分配内存空间大小为MATRIX_SIZE * MATRIX_SIZE个float类型元素所占的空间
float* B = (float*)malloc(MATRIX_SIZE * MATRIX_SIZE * sizeof(float));
// 为基础矩阵乘法结果矩阵分配内存空间大小为MATRIX_SIZE * MATRIX_SIZE个float类型元素所占的空间
float* resultMatrixBase = (float*)malloc(MATRIX_SIZE * MATRIX_SIZE * sizeof(float));
// 为NEON优化矩阵乘法结果矩阵分配内存空间大小为MATRIX_SIZE * MATRIX_SIZE个float类型元素所占的空间
float* resultMatrixNeon = (float*)malloc(MATRIX_SIZE * MATRIX_SIZE * sizeof(float));
// 初始化向量a和b的元素值
// 循环遍历向量的每个元素
for (int i = 0; i < VECTOR_SIZE; ++i) {
// 将向量a的第i个元素赋值为i的浮点数形式
a[i] = (float)i;
// 将向量b的第i个元素赋值为i + 1的浮点数形式
b[i] = (float)(i + 1);
}
// 初始化矩阵A和B的元素值
// 循环遍历矩阵的每个元素
for (int i = 0; i < MATRIX_SIZE * MATRIX_SIZE; ++i) {
// 将矩阵A的第i个元素赋值为i的浮点数形式
A[i] = (float)i;
// 将矩阵B的第i个元素赋值为i + 1的浮点数形式
B[i] = (float)(i + 1);
}
#ifdef _WIN32
// 在Windows平台下定义用于存储时钟频率的LARGE_INTEGER结构体变量frequency
LARGE_INTEGER frequency;
// 获取高精度性能计数器的频率将结果存储到frequency变量中
QueryPerformanceFrequency(&frequency);
// 定义用于存储起始时间和结束时间的LARGE_INTEGER结构体变量startTime和endTime
LARGE_INTEGER startTime, endTime;
#else
// 在非Windows平台下定义用于存储时间的timespec结构体变量start和end
struct timespec start, end;
#endif
// 向量加法基础实现的时间测量及结果输出
// 向量加法基础实现Windows平台部分
#ifdef _WIN32
// 获取高精度性能计数器的当前值作为起始时间存储到startTime变量中
QueryPerformanceCounter(&startTime);
// 调用基础向量加法函数对向量a和b进行加法运算结果存储到resultVectorBase中
vectorAddBase(a, b, resultVectorBase, VECTOR_SIZE);
// 获取高精度性能计数器的当前值作为结束时间存储到endTime变量中
QueryPerformanceCounter(&endTime);
// 调用函数计算并输出Windows平台下基础向量加法的执行时间
printf("Base vector addition time: %f seconds\n", get_time_diff_windows(startTime, endTime, frequency));
#else
// 获取单调时钟的当前时间作为起始时间存储到start变量中
clock_gettime(CLOCK_MONOTONIC, &start);
// 调用基础向量加法函数对向量a和b进行加法运算结果存储到resultVectorBase中
vectorAddBase(a, b, resultVectorBase, VECTOR_SIZE);
// 获取单调时钟的当前时间作为结束时间存储到end变量中
clock_gettime(CLOCK_MONOTONIC, &end);
// 调用函数计算并输出非Windows平台下基础向量加法的执行时间
printf("Base vector addition time: %f seconds\n", get_time_diff(start, end));
#endif
// 向量加法NEON优化实现的时间测量及结果输出
// 向量加法NEON优化实现Windows平台部分
#ifdef _WIN32
// 获取高精度性能计数器的当前值作为起始时间存储到startTime变量中
QueryPerformanceCounter(&startTime);
// 调用NEON优化向量加法函数对向量a和b进行加法运算结果存储到resultVectorNeon中
vectorAddNeon(a, b, resultVectorNeon, VECTOR_SIZE);
// 获取高精度性能计数器的当前值作为结束时间存储到endTime变量中
QueryPerformanceCounter(&endTime);
// 调用函数计算并输出Windows平台下NEON优化向量加法的执行时间
printf("NEON optimized vector addition time: %f seconds\n", get_time_diff_windows(startTime, endTime, frequency));
#else
// 获取单调时钟的当前时间作为起始时间存储到start变量中
clock_gettime(CLOCK_MONOTONIC, &start);
// 调用NEON优化向量加法函数对向量a和b进行加法运算结果存储到resultVectorNeon中
vectorAddNeon(a, b, resultVectorNeon, VECTOR_SIZE);
// 获取单调时钟的当前时间作为结束时间存储到end变量中
clock_gettime(CLOCK_MONOTONIC, &end);
// 调用函数计算并输出非Windows平台下NEON优化向量加法的执行时间
printf("NEON optimized vector addition time: %f seconds\n", get_time_diff(start, end));
#endif
// 矩阵乘法基础实现的时间测量及结果输出
// 矩阵乘法基础实现Windows平台部分
#ifdef _WIN32
// 获取高精度性能计数器的当前值作为起始时间存储到startTime变量中
QueryPerformanceCounter(&startTime);
// 调用基础矩阵乘法函数对矩阵A和B进行乘法运算结果存储到resultMatrixBase中
matrixMultiplyBase(A, B, resultMatrixBase, MATRIX_SIZE);
// 获取高精度性能计数器的当前值作为结束时间存储到endTime变量中
QueryPerformanceCounter(&endTime);
// 调用函数计算并输出Windows平台下基础矩阵乘法的执行时间
printf("Base matrix multiplication time: %f seconds\n", get_time_diff_windows(startTime, endTime, frequency));
#else
// 获取单调时钟的当前时间作为起始时间存储到start变量中
clock_gettime(CLOCK_MONOTONIC, &start);
// 调用基础矩阵乘法函数对矩阵A和B进行乘法运算在矩阵乘法运算中按照常规算法计算矩阵A和B的乘积结果存储到resultMatrixBase中
matrixMultiplyBase(A, B, resultMatrixBase, MATRIX_SIZE);
// 获取单调时钟的当前时间作为结束时间存储到end变量中
clock_gettime(CLOCK_MONOTONIC, &end);
// 调用函数计算并输出非Windows平台下基础矩阵乘法的执行时间
printf("Base matrix multiplication time: %f seconds\n", get_time_diff(start, end));
#endif
// 矩阵乘法NEON优化实现的时间测量及结果输出
// 矩阵乘法NEON优化实现Windows平台部分
#ifdef _WIN32
// 获取高精度性能计数器的当前值作为起始时间存储到startTime变量中
QueryPerformanceCounter(&startTime);
// 调用NEON优化矩阵乘法函数对矩阵A和B进行乘法运算结果存储到resultMatrixNeon中
matrixMultiplyNeon(A, B, resultMatrixNeon, MATRIX_SIZE);
// 获取高精度性能计数器的当前值作为结束时间存储到endTime变量中
QueryPerformanceCounter(&endTime);
// 调用函数计算并输出Windows平台下NEON优化矩阵乘法的执行时间
printf("NEON optimized matrix multiplication time: %f seconds\n", get_time_diff_windows(startTime, endTime, frequency));
#else
// 获取单调时钟的当前时间作为起始时间存储到start变量中
clock_gettime(CLOCK_MONOTONIC, &start);
// 调用NEON优化矩阵乘法函数对矩阵A和B进行乘法运算结果存储到resultMatrixNeon中
matrixMultiplyNeon(A, B, resultMatrixNeon, MATRIX_SIZE);
// 获取单调时钟的当前时间作为结束时间存储到end变量中
clock_gettime(CLOCK_MONOTONIC, &end);
// 调用函数计算并输出非Windows平台下NEON优化矩阵乘法的执行时间
printf("NEON optimized matrix multiplication time: %f seconds\n", get_time_diff(start, end));
#endif
// 释放之前为向量和矩阵分配的内存空间,以避免内存泄漏
free(a);
free(b);
free(resultVectorBase);
free(resultVectorNeon);
free(A);
free(B);
free(resultMatrixBase);
free(resultMatrixNeon);
return 0;
}