hedgefund

c_matmul_SIMD

Jan 8th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.00 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <immintrin.h>  // Include SIMD intrinsics
  4. #include <time.h>
  5.  
  6. #define N 1024  // Size of the matrix (N x N)
  7. #define SIM_WIDTH 8 // Number of elements processed at a time (AVX2)
  8.  
  9. // Initialize a matrix with random values
  10. void initialize_matrix(float* matrix, int size)
  11. {
  12.     for (int i = 0; i < size; i++) {
  13.         for (int j = 0; j < size; j++) {
  14.             matrix[i * size + j] = (float)rand() / RAND_MAX;
  15.         }
  16.     }
  17. }
  18.  
  19. // Perform matrix multiplication using SIMD
  20. void matrix_multiply_simd(float* A, float* B, float* C, int size)
  21. {
  22.     for (int i = 0; i < size; i++) {
  23.         for (int j = 0; j < size; j += SIM_WIDTH) {
  24.             __m256 c = _mm256_setzero_ps();
  25.  
  26.             for (int k = 0; k < size; k++) {
  27.                 __m256 a = _mm256_set1_ps(A[i * size + k]);
  28.                 __m256 b = _mm256_loadu_ps(&B[k * size + j]);
  29.             }
  30.  
  31.             _mm256_storeu_ps(&C[i * size + j], c);
  32.         }
  33.     }
  34. }
  35.  
  36. // // Perform matrix multiplication without SIMD (for comparison)
  37. // void matrix_multiply_scalar(float* A, float* B, float* C, int size)
  38. // {
  39. //     for (int i = 0; i < size; i++) {
  40. //         for (int j = 0; j < size; j++) {
  41. //             float sum = 0.0f;
  42. //             for (int k = 0; k < size; k++) {
  43. //                 sum += A[i * size + k] * B[k * size + j];
  44. //             }
  45. //             C[i * size + j] = sum;
  46. //         }
  47. //     }
  48. // }
  49.  
  50. int main()
  51. {
  52.     // Allocate memory for matrices
  53.     float* A = (float*)aligned_alloc(32, N * N * sizeof(float));
  54.     float* B = (float*)aligned_alloc(32, N * N * sizeof(float));
  55.     float* C_simd = (float*)aligned_alloc(32, N * N * sizeof(float));
  56.     // float* C_scalar = (float*)aligned_alloc(32, N * N * sizeof(float));
  57.  
  58.     // Initialize matrices with random values
  59.     srand(time(NULL));
  60.     initialize_matrix(A, N);
  61.     initialize_matrix(B, N);
  62.  
  63.     // Benchmark SIMD matrix multiplication
  64.     clock_t start = clock();
  65.     matrix_multiply_simd(A, B, C_simd, N);
  66.     clock_t end = clock();
  67.     double simd_time = (double)(end - start) / CLOCKS_PER_SEC * 1000;
  68.     printf("SIMD Matrix Multiplication Time: %.2f ms\n", simd_time);
  69.  
  70.     // Benchmark scalar matrix multiplication
  71.     // start = clock();
  72.     // matrix_multiply_scalar(A, B, C_scalar, N);
  73.     // end = clock();
  74.     // double scalar_time = (double)(end - start) / CLOCKS_PER_SEC * 1000;
  75.     // printf("Scalar Matrix Multiplication Time: %.2f ms\n", scalar_time);
  76.     //
  77.     // // Verify correctness
  78.     // for (int i = 0; i < N; i++) {
  79.     //     for (int j = 0; j < N; j++) {
  80.     //         if (fabs(C_simd[i * N + j] - C_scalar[i * N + j]) > 1e-5) {
  81.     //             printf("Mismatch at (%d, %d): SIMD=%f, Scalar=%f\n", i, j, C_simd[i * N + j], C_scalar[i * N + j]);
  82.     //             return 1;
  83.     //         }
  84.     //     }
  85.     // }
  86.     // printf("Results match!\n");
  87.  
  88.     // Free allocated memory
  89.     free(A);
  90.     free(B);
  91.     free(C_simd);
  92.     // free(C_scalar);
  93.  
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment