HIP编程
时间:2020-04-17
本文章向大家介绍HIP编程,主要包括HIP编程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.使用hip实现矩阵乘
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #include <hip/hip_runtime.h> 5 #include <hip/hip_runtime_api.h> 6 7 #define M 4 8 #define K 4 9 #define N 4 10 11 void initial(double* list,int row,int col) 12 { 13 double *num = list; 14 for (int i=0; i<row*col; i++) 15 { 16 num[i] = rand()%10; 17 } 18 } 19 20 void CpuMatrix(double *A,double *B,double *C) 21 { 22 int i,j,k; 23 24 for( i=0; i<M; i++) 25 { 26 for(j=0; j<N; j++) 27 { 28 double sum = 0; 29 for(int k=0; k<K; k++) 30 { 31 sum += A[i*K + k] * B[k * N + j]; 32 } 33 C[i * N + j] = sum; 34 } 35 } 36 } 37 38 __global__ void GpuMatrix(double *dev_A,double *dev_B,double *dev_C) 39 { 40 int ix = hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x; 41 int iy = hipBlockIdx_y * hipBlockDim_y + hipThreadIdx_y; 42 if(ix<K && iy<M) 43 { 44 double sum = 0; 45 for( int k = 0; k < K;k++) 46 { 47 sum += dev_A[iy*K + k] * dev_B[k*N + ix]; 48 } 49 dev_C[iy * N + ix] = sum; 50 } 51 } 52 53 void printMatrix(double *list,int row,int col) 54 { 55 double *p = list; 56 for(int i=0; i<row; i++) 57 { 58 for(int j=0; j<col; j++) 59 { 60 printf("%10lf",p[j]); 61 } 62 p = p + col; 63 printf("\n"); 64 } 65 } 66 int main(int argc,char **argv) 67 { 68 int Axy = M*K; 69 int Abytes = Axy * sizeof(double); 70 71 int Bxy = K*N; 72 int Bbytes = Bxy * sizeof(double); 73 74 int nxy = M*N; 75 int nbytes = nxy * sizeof(double); 76 77 float time_cpu,time_gpu; 78 79 clock_t start_cpu,stop_cpu; 80 81 hipEvent_t start_GPU,stop_GPU; 82 83 double *host_A, *host_B, *host_C, *c_CPU; 84 host_A = (double*)malloc(Abytes); 85 host_B = (double*)malloc(Bbytes); 86 host_C = (double*)malloc(nbytes); 87 c_CPU = (double*)malloc(nbytes); 88 89 90 initial(host_A,M,K); 91 92 printf("A:(%d,%d):\n",M,K); 93 printMatrix(host_A,M,K); 94 95 initial(host_B,K,N); 96 97 printf("B:(%d,%d):\n",K,N); 98 printMatrix(host_B,K,N); 99 100 // start_cpu = clock(); 101 CpuMatrix(host_A,host_B,host_C); 102 // stop_cpu = clock(); 103 104 printf("Host_C:(%d,%d):\n",M,N); 105 // printf("\nCPU time is %f(ms)\n",(float)(stop_cpu-start_cpu)/CLOCKS_PER_SEC); 106 printMatrix(host_C,M,N); 107 double *dev_A,*dev_B,*dev_C; 108 hipMalloc(&dev_A,Axy*sizeof(double)); 109 hipMalloc(&dev_B,Bxy*sizeof(double)); 110 hipMalloc(&dev_C,nxy*sizeof(double)); 111 112 dim3 block(1024,1); 113 dim3 grid(64,64); 114 115 hipMemcpy(dev_A,host_A,Abytes,hipMemcpyDeviceToHost); 116 hipMemcpy(dev_B,host_B,Bbytes,hipMemcpyDeviceToHost); 117 118 hipEventCreate(&start_GPU); 119 hipEventCreate(&stop_GPU); 120 hipEventRecord(start_GPU,0); 121 hipLaunchKernelGGL(GpuMatrix,grid,block,0,0,dev_A,dev_B,dev_C); 122 hipEventRecord(stop_GPU,0); 123 hipEventSynchronize(start_GPU); 124 hipEventSynchronize(stop_GPU); 125 hipEventElapsedTime(&time_gpu, start_GPU,stop_GPU); 126 printf("\nThe time from GPU:\t%f(ms)\n", time_GPU/1000); 127 hipDeviceSynchronize(); 128 hipEventDestroy(start_GPU); 129 hipEventDestroy(stop_GPU); 130 131 hipMemcpy(c_CPU,dev_C,nbytes,hipMemcpyDeviceToHost); 132 printf("device_C:(%d,%d):\n",M,N); 133 printMatrix(c_CPU,M,N); 134 135 136 hipFree(dev_A); 137 hipFree(dev_B); 138 hipFree(dev_C); 139 free(host_A); 140 free(host_B); 141 free(host_C); 142 free(c_CPU); 143 144 return 0; 145 }
结果如下:
原文地址:https://www.cnblogs.com/lin1216/p/12719836.html
- Python中的random模块用于生成随机数
- 简单易学的机器学习算法——极限学习机(ELM)
- 图片数据集太少?Keras Image Data Augmentation 各参数详解
- 备库归档删除策略失效的问题分析 (r7笔记第6天)
- 优化算法——梯度下降法
- Java基础-26(02)总结网络编程
- 记一次数据同步需求的改进(二) (r7笔记第5天)
- Python信贷数据处理与初步分析(ZIP解压)
- web前端之锋利的jQuery八:jQuery插件的使用(表单验证、表单提交)
- 优化算法——牛顿法(Newton Method)
- merge语句导致的CPU使用率过高的优化(r7笔记第4天)
- 由dual导致的一个潜在的监控问题(r7笔记第3天)
- 剑指Offer——编程题的Java实现
- Python中if __name__ == "__main__": 的作用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第003课 linux入门命令详解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。
- 达梦数据库适配问题
- Angular Component UI单元测试的隔离策略
- 第005课 linux进阶命令(文件查找,文件解压操作详解)
- 没有这 29 款插件的 Chrome 是没有灵魂的
- 第006课 开发板熟悉与体验
- Angular Observable数据类型的单元测试数据准备
- 第007课 裸机开发步骤和工具使用(SourceInght NotePad++使用)
- Angular jasmine.expect单步调试
- 第008课 第1个ARM裸板程序及引申(点亮LED灯)
- SharedPreferences VS MMKV
- 第009课 gcc和arm-linux-gcc和Makefile
- Go 每日一库之 quicktemplate