当前位置: 首页 > news >正文

尝试编译 AMD ROCm 的 llvm-project

0,环境

ubuntu 22.04

gcc-11

x86_64 18cores/36threads

256GB RAM

rocm 6.0.2

Radeon VII

1,第一次尝试

构建命令:

cmake -G "Unix Makefiles" ../llvm \
-DLLVM_ENABLE_PROJECTS="clang;lld;lldb;mlir;openmp" \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_RUNTIMES=all \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DCMAKE_INSTALL_PREFIX=../../local_amdgpu

make -j32

效果:

由于 ncurses 库没有搞定,所以失败了:

估计是lldb的layout src之类的命令会用到 ncurses,

对策:不编译 lldb项目

2,第二次尝试

 删掉了 lldb 和 openmp,调整了TARGET,加入了 NVPTX,

重来:

cmake -G "Unix Makefiles" ../llvm \
-DLLVM_ENABLE_PROJECTS="clang;lld;mlir" \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="Native;NVPTX;AMDGPU" \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_RUNTIMES=all \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DCMAKE_INSTALL_PREFIX=../../local_amdgpu

make -j34

编译成功,

安装 make install

效果:

3,测试编译rocm hip源码

3.1 源码示例

vectorAdd.hip

#include <stdio.h>
#include <hip/hip_runtime.h>__global__ void vectorAdd(const float *A, const float *B, float *C) {int i = blockDim.x * blockIdx.x + threadIdx.x;C[i] = A[i] + B[i] + 0.0f;
}int main(void) {hipError_t err = hipSuccess;int numElements = 512;size_t size = numElements * sizeof(float);printf("[Vector addition of %d elements]\n", numElements);float *h_A = (float *)malloc(size);float *h_B = (float *)malloc(size);float *h_C = (float *)malloc(size);if (h_A == NULL || h_B == NULL || h_C == NULL) {fprintf(stderr, "Failed to allocate host vectors!\n");exit(EXIT_FAILURE);}for (int i = 0; i < numElements; ++i) {h_A[i] = rand() / (float)RAND_MAX;h_B[i] = rand() / (float)RAND_MAX;}float *d_A = NULL;err = hipMalloc((void **)&d_A, size);if (err != hipSuccess) {fprintf(stderr, "Failed to allocate device vector A (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}float *d_B = NULL;err = hipMalloc((void **)&d_B, size);if (err != hipSuccess) {fprintf(stderr, "Failed to allocate device vector B (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}float *d_C = NULL;err = hipMalloc((void **)&d_C, size);if (err != hipSuccess) {fprintf(stderr, "Failed to allocate device vector C (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}printf("Copy input data from the host memory to the CUDA device\n");err = hipMemcpy(d_A, h_A, size, hipMemcpyHostToDevice);if (err != hipSuccess) {fprintf(stderr,"Failed to copy vector A from host to device (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}err = hipMemcpy(d_B, h_B, size, hipMemcpyHostToDevice);if (err != hipSuccess) {fprintf(stderr,"Failed to copy vector B from host to device (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}int threadsPerBlock = 256;int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;printf("CUDA kernel launch with %d blocks of %d threads\n", blocksPerGrid,threadsPerBlock);vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C);err = hipGetLastError();if (err != hipSuccess) {fprintf(stderr, "Failed to launch vectorAdd kernel (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}printf("Copy output data from the CUDA device to the host memory\n");err = hipMemcpy(h_C, d_C, size, hipMemcpyDeviceToHost);if (err != hipSuccess) {fprintf(stderr,"Failed to copy vector C from device to host (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}for (int i = 0; i < numElements; ++i) {if (fabs(h_A[i] + h_B[i] - h_C[i]) > 1e-5) {fprintf(stderr, "Result verification failed at element %d!\n", i);exit(EXIT_FAILURE);}}printf("Test PASSED\n");err = hipFree(d_A);if (err != hipSuccess) {fprintf(stderr, "Failed to free device vector A (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}err = hipFree(d_B);if (err != hipSuccess) {fprintf(stderr, "Failed to free device vector B (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}err = hipFree(d_C);if (err != hipSuccess) {fprintf(stderr, "Failed to free device vector C (error code %s)!\n",hipGetErrorString(err));exit(EXIT_FAILURE);}free(h_A);free(h_B);free(h_C);printf("Done\n");return 0;
}

3.2 编译运行

$ ../../local_amdgpu/bin/clang++ hello_vectorAdd.hip  --rocm-path=/opt/rocm

这样简单的运行 clang++,还不太确定是不是仅仅起到了编译驱动的作用,后面进一步分析。

运行成功,

效果:

未完待续。。。

相关文章:

  • 数学建模 —— 层次分析法(2)
  • 新项目来了,JDK 17和JDK 21 该如何选择?
  • 浅谈JavaScript中的对象赋值
  • LabVIEW中PID控制器系统的噪声与扰动抑制策略
  • 扫码报名活动时,如何避免重复报名?
  • Java18新特性有哪些
  • Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
  • LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现
  • Unity中的MVC框架
  • C++ lambda表达式的作用和代码示例
  • autodl服务器中YOLOx训练自己数据集
  • 人脸识别系统之动态人脸识别
  • vscode 好用的插件
  • 程序员坐牢了,会被安排去写代码吗?
  • Reddisson的常用的yml配置选项
  • ES6指北【2】—— 箭头函数
  • JavaScript 基本功--面试宝典
  • JSONP原理
  • Lucene解析 - 基本概念
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • October CMS - 快速入门 9 Images And Galleries
  • PHP的类修饰符与访问修饰符
  • Python 反序列化安全问题(二)
  • SpringBoot几种定时任务的实现方式
  • Vue.js 移动端适配之 vw 解决方案
  • vue中实现单选
  • 创建一个Struts2项目maven 方式
  • 聚簇索引和非聚簇索引
  • 类orAPI - 收藏集 - 掘金
  • 前端存储 - localStorage
  • 如何合理的规划jvm性能调优
  • 深入浏览器事件循环的本质
  • 我看到的前端
  • 一份游戏开发学习路线
  • 用jquery写贪吃蛇
  • 怎么把视频里的音乐提取出来
  • 栈实现走出迷宫(C++)
  • 1.Ext JS 建立web开发工程
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​TypeScript都不会用,也敢说会前端?
  • #window11设置系统变量#
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $forceUpdate()函数
  • (27)4.8 习题课
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (k8s)kubernetes 部署Promehteus学习之路
  • (zhuan) 一些RL的文献(及笔记)
  • (笔记)M1使用hombrew安装qemu
  • (笔试题)分解质因式
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (回溯) LeetCode 78. 子集