Advertisement
Guest User

Untitled

a guest
Mar 28th, 2021
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include "../common.h"
  5.  
  6. __global__ void matmul(int **a, int **b, int **c, int n) {
  7.     printf("%d\t%d\n", blockIdx.x, threadIdx.x);
  8.     int i = blockIdx.x, j = threadIdx.x;
  9.     c[i][j] = 0;
  10.     for (int k = 0; k < n; k++) {
  11.         c[i][j] += a[i][k] * b[k][j];
  12.     }
  13. }
  14.  
  15. void init(int ***pa, int ***pb, int ***pc, int n) {
  16.     CHECK(cudaMallocManaged(pa, n * sizeof(int*)));
  17.     CHECK(cudaMallocManaged(pb, n * sizeof(int*)));
  18.     CHECK(cudaMallocManaged(pc, n * sizeof(int*)));
  19.     int **a = *pa, **b = *pb, **c = *pc;
  20.  
  21.     char file[16];
  22.     sprintf(file, "%d.in", n);
  23.  
  24.     FILE *fp = fopen(file, "rb");
  25.     for (int i = 0; i < n; i++) {
  26.         CHECK(cudaMallocManaged(a + i, n * sizeof(int)));
  27.         CHECK(cudaMallocManaged(c + i, n * sizeof(int)));
  28.         fread(a[i], sizeof(int), n, fp);
  29.     }
  30.     for (int i = 0; i < n; i++) {
  31.         CHECK(cudaMallocManaged(b + i, n * sizeof(int)));
  32.         fread(b[i], sizeof(int), n, fp);
  33.     }
  34.     fclose(fp);
  35. }
  36.  
  37. int main(int argc, char **argv) {
  38.     int n = atoi(argv[1]);
  39.     int **a, **b, **c;
  40.     init(&a, &b, &c, n);
  41.    
  42.     matmul<<<n, n>>>(a, b, c, n);
  43.     CHECK(cudaDeviceSynchronize());
  44.  
  45.     printf("a: %d\nb: %d\nc: %d\n", a[100][100], b[100][100], c[100][100]);
  46.  
  47.     char file[16];
  48.     sprintf(file, "%d.out", n);
  49.     FILE *fp = fopen(file, "wb");
  50.     for (int i = 0; i < n; i++) {
  51.         fwrite(c[i], sizeof(int), n, fp);
  52.     }
  53.  
  54.     fclose(fp);
  55.     for (int i = 0; i < n; i++) {
  56.         CHECK(cudaFree(a[i]));
  57.         CHECK(cudaFree(b[i]));
  58.         CHECK(cudaFree(c[i]));
  59.     }
  60.     CHECK(cudaFree(a));
  61.     CHECK(cudaFree(b));
  62.     CHECK(cudaFree(c));
  63.  
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement