| 19 | } |
| 20 | } |
| 21 | void Mul_Matrixdcu(float *A, float *B, float *C, int m1, int n1, int n2) |
| 22 | { |
| 23 | float *d_A, *d_B, *d_C; |
| 24 | size_t sizeA = n1 * m1 * sizeof(float); |
| 25 | size_t sizeB = n2 * m1 * sizeof(float); |
| 26 | size_t sizeC = n1 * n2 * sizeof(float); |
| 27 | //在设备端(dcu)申请地址空间,以存储数据 |
| 28 | hipMalloc(&d_A, sizeA); |
| 29 | hipMalloc(&d_B, sizeB); |
| 30 | hipMalloc(&d_C, sizeC); |
| 31 | //将主机端数据传输到dcu以做计算 |
| 32 | hipMemcpy(d_A, A, sizeA, hipMemcpyHostToDevice); |
| 33 | hipMemcpy(d_B, B, sizeB, hipMemcpyHostToDevice); |
| 34 | //这里将C也传进去,因为可能有一部分计算值已经在C中了 |
| 35 | hipMemcpy(d_C, C, sizeC, hipMemcpyHostToDevice); |
| 36 | dim3 dimBlock(BLOCK_SIZE,BLOCK_SIZE); |
| 37 | dim3 dimGrid((n2-1)/BLOCK_SIZE + 1, (m1-1)/BLOCK_SIZE + 1); |
| 38 | //调用核函数 |
| 39 | hipLaunchKernelGGL(MatMulKernel,dimGrid,dimBlock,0,0,d_A,d_B,d_C, m1, n1, n2); |
| 40 | //将dcu计算的数据传回主机端 |
| 41 | hipMemcpy(C, d_C, sizeC, hipMemcpyDeviceToHost); |
| 42 | hipFree(d_A); |
| 43 | hipFree(d_B); |
| 44 | hipFree(d_C); |
| 45 | } |
| 46 | int main(int argc, char *argv[]){ |
| 47 | int id,p,part,num,i, |
| 48 | upRank,downRank,leftRank,rightRank; |