#include #include #include #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; }