unified-runtime编译与验证

news2024/10/24 4:32:12

unified-runtime编译与验证

  • 一.创建容器
  • 二.编译unified-runtime
  • 三.生成一个cuda ptx kernel
  • 四.API测试

unified-runtime编译与验证

一.创建容器

docker run --gpus all --shm-size=32g -ti \
            -e NVIDIA_VISIBLE_DEVICES=all --privileged --net=host \
            --rm -it \
            -v $PWD:/home \
            -w /home ghcr.io/intel/llvm/ubuntu2204_build /bin/bash

二.编译unified-runtime

git clone https://github.com/oneapi-src/unified-runtime
cd unified-runtime
mkdir build
cd build
cmake -DUR_BUILD_ADAPTER_CUDA=ON -DUR_BUILD_ADAPTER_NATIVE_CPU=ON -DUMF_DISABLE_HWLOC=ON ..
make

三.生成一个cuda ptx kernel

tee cuda_copy.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <assert.h>
#include <cstdio>
#include <cuda.h>

__global__ void kernel_copy(float *input,float *output)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    output[tid]=input[tid];
}
EOF
/usr/local/cuda/bin/nvcc -std=c++17 -dc -lineinfo -arch=sm_86 -ptx cuda_copy.cu -o cuda_copy.ptx

四.API测试

tee um_query_device.cpp<<-'EOF'
#include <iostream>
#include <memory>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include "ur_api.h"

#define ur_check(call) \
    do { \
        ur_result_t error = call; \
        if (error != UR_RESULT_SUCCESS) { \
            fprintf(stderr, " error in file '%s' in line %i: %d.\n", __FILE__, __LINE__,error); \
            exit(EXIT_FAILURE); \
        } \
    } while (0)
    
constexpr unsigned PAGE_SIZE = 4096;
template <typename T, size_t N> struct alignas(PAGE_SIZE) AlignedArray {
    T data[N];
};
	
int main(int, char *[]) {
    ur_result_t status;
    ur_check(urLoaderInit(0, nullptr));
    std::cout << "Platform initialized.\n";

    uint32_t adapterCount = 0;
    std::vector<ur_adapter_handle_t> adapters;
    uint32_t platformCount = 0;
    std::vector<ur_platform_handle_t> platforms;
    ur_check(urAdapterGet(0, nullptr, &adapterCount));
    adapters.resize(adapterCount);
    ur_check(urAdapterGet(adapterCount, adapters.data(), nullptr));
    ur_check(urPlatformGet(adapters.data(), adapterCount, 1, nullptr,&platformCount));
    platforms.resize(platformCount);
    ur_check(urPlatformGet(adapters.data(), adapterCount, platformCount,
                           platforms.data(), nullptr));
    for (auto p : platforms) {
        ur_api_version_t api_version = {};
        ur_check(urPlatformGetApiVersion(p, &api_version));
        std::cout << "API version: " << UR_MAJOR_VERSION(api_version) << "."
                  << UR_MINOR_VERSION(api_version) << std::endl;

        uint32_t deviceCount = 0;
        ur_check(urDeviceGet(p, UR_DEVICE_TYPE_GPU, 0, nullptr, &deviceCount));
        std::vector<ur_device_handle_t> devices(deviceCount);
        ur_check(urDeviceGet(p, UR_DEVICE_TYPE_GPU, deviceCount, devices.data(),
                             nullptr));
        for (auto d : devices) {
            ur_device_type_t device_type = UR_DEVICE_TYPE_ALL;
            ur_check(urDeviceGetInfo(
                d, UR_DEVICE_INFO_TYPE, sizeof(ur_device_type_t),
                static_cast<void *>(&device_type), nullptr));
            static const size_t DEVICE_NAME_MAX_LEN = 1024;
            char device_name[DEVICE_NAME_MAX_LEN] = {0};
            ur_check(urDeviceGetInfo(d, UR_DEVICE_INFO_NAME, DEVICE_NAME_MAX_LEN - 1,
                                static_cast<void *>(&device_name), nullptr));
            if (device_type == UR_DEVICE_TYPE_GPU) {
                std::cout << "Found a " << device_name << " gpu.\n";
            }
            ur_context_handle_t hContext;
            ur_check(urContextCreate(1, &d, nullptr, &hContext));
            std::ifstream inputFile("cuda_copy.ptx");
            std::ostringstream buffer;
            buffer << inputFile.rdbuf(); 
            std::string fileContent = buffer.str();
            inputFile.close();
            ur_program_handle_t hProgram;
            ur_check(urProgramCreateWithBinary(hContext, d, fileContent.length(), (const uint8_t *)fileContent.c_str(),nullptr,&hProgram));
            constexpr int a_size = 32;
            AlignedArray<float, a_size> a, b;
            for (auto i = 0; i < a_size; ++i) {
                a.data[i] = a_size - i;
                b.data[i] = 0;
            }
            status=urProgramBuild(hContext, hProgram, nullptr);
            ur_mem_handle_t dA, dB;
            ur_check(urMemBufferCreate(hContext, UR_MEM_FLAG_READ_WRITE,
                                       a_size * sizeof(int), nullptr, &dA));
            ur_check(urMemBufferCreate(hContext, UR_MEM_FLAG_READ_WRITE,
                                       a_size * sizeof(int), nullptr, &dB));
            ur_kernel_handle_t hKernel;
            ur_check(urKernelCreate(hProgram, "_Z11kernel_copyPfS_", &hKernel));
            ur_check(urKernelSetArgMemObj(hKernel, 0, nullptr, dA));
            ur_check(urKernelSetArgMemObj(hKernel, 1, nullptr, dB));
            ur_queue_handle_t queue;
            ur_check(urQueueCreate(hContext, d, nullptr, &queue));
            ur_check(urEnqueueMemBufferWrite(queue, dA, true, 0, a_size * sizeof(float),
                                             a.data, 0, nullptr, nullptr));
            ur_check(urEnqueueMemBufferWrite(queue, dB, true, 0, a_size * sizeof(float),
                                             b.data, 0, nullptr, nullptr));
            const size_t gWorkOffset[] = {0, 0, 0};
            const size_t gWorkSize[] = {a_size, 1, 1};
            const size_t lWorkSize[] = {1, 1, 1};
            ur_event_handle_t event;
            ur_check(urEnqueueKernelLaunch(queue, hKernel, 3, gWorkOffset, gWorkSize,
                                           lWorkSize, 0, nullptr, &event));

            ur_check(urEnqueueMemBufferRead(queue, dB, true, 0, a_size * sizeof(int),
                                            b.data, 1, &event, nullptr));

            ur_check(urQueueFinish(queue));
            ur_check(urContextRelease(hContext));
            for (auto i = 0; i < a_size; ++i) {
               printf("%.2f\n",b.data[i]);
            }
        }
    }
out:
    for (auto adapter : adapters) {
        urAdapterRelease(adapter);
    }
    urLoaderTearDown();
    return status == UR_RESULT_SUCCESS ? 0 : 1;
}
EOF
g++ -o um_query_device um_query_device.cpp -I../include  -L lib -lur_loader -lpthread
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/lib ./um_query_device

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计】基于SpringBoot的网上商城系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;非常合适作为大学的毕业设计&#xff0c;难以适中。 &#x1f525;采用技术&#xff1a;Sp…

Java项目-基于springboot框架的疫苗接种管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

huggingface的数据集下载(linux下clone)

1. 安装lfs sudo apt-get install git-lfs 或者 apt-get install git-lfs 2. git lfs install git lfs install 3. git clone dataset包 第2&#xff0c;3步骤的截图如下&#xff1a;

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…

架构设计笔记-21-案例分析

1.遗留系统策略 / 数据迁移 / REST和RPC风格 2.分布式系统 / 分布式对象调用 3.开放式架构 / GOA 4.ESB 5.FMEA故障分析 6. 加密 / 公钥体系机制 / 加解密API和透明加密 7.嵌入式系统故障 / 故障滤波算法 / 容错算法 8.开源框架struts / spring / Hibenate 9.企业应用集成 10.T…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

作者&#xff1a;彦鸿 背景 随着 LLM&#xff08;大语言模型&#xff09;技术的不断成熟和应用场景的不断拓展&#xff0c;越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理方面表现出令人印象深刻的能力。然而&#xff0c;其内部机制仍然不明确&am…

2023 WMCTF pwn【blindless jit】

文章目录 blindlessIDA结构体命名逆向漏洞方法1方法2 exp jitstrtol(v9, &endptr, 16)__errno_location和__throw_out_of_range详细解释&#xff1a; __errno_location相关具体操作详细分析为什么要执行上述代码&#xff1f;示例代码段的解释 _acrt_iob_funcSetProcessMiti…

Vue.js 学习总结(9)—— Vue 3 组件封装技巧

1、需求说明 需求背景&#xff1a;日常开发中&#xff0c;我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发&#xff0c;提升效率。有时我们需要进行个性化封装&#xff0c;以满足在项目中大量使用的需求。错误示范&#xff1a;基于a-modal封装一个自定…

MinIO安装教程

MinIO简介 Minio是一个开源的、云原生的分布式对象存储系统&#xff0c;是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。 它一大特点就是轻量&#xff0c;虽然轻量&#xff0c;却拥有着不…

适合忙碌职场人的进度计划工具

明确的进度计划是一种约束机制&#xff0c;职场人往往面临多项任务&#xff0c;通过进度计划管理&#xff0c;可以将工作按照优先级和时间要求进行分解&#xff0c;而进度计划管理可以很好地帮助职场人发现时间浪费的环节。此外&#xff0c;对于忙碌的职场人来说&#xff0c;不…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态&#xff1a;应用的多个实例必须按照某种顺序启动&#xff0c;并且必须成组存在&#xff0c;例如一个应用中必须存在一个A Pod和两个B Pod&#xff0c;且A Pod必须先于B Pod启动的场景 存储状态&#xff1a;应用存在多个实例&…

《使用Gin框架构建分布式应用》阅读笔记:p88-p100

《用Gin框架构建分布式应用》学习第6天&#xff0c;p88-p100总结&#xff0c;总计13页。 一、技术总结 1.MongoDB CRUD操作 (1)InsertOne(), InsertMany() (2)Find() (3)UpdateOne, UpdateMany() (4)DeleteOne(), DeleteMany() 2.MongoDB primitive p96&#xff0c;rec…

Docker 基础入门

Docker 基础入门 前言 在云计算和微服务架构日益盛行的今天&#xff0c;软件开发与部署的效率和灵活性成为了企业竞争力的关键因素之一。Docker&#xff0c;作为一种开源的容器化平台&#xff0c;凭借其轻量级、可移植性和易于管理的特性&#xff0c;迅速成为现代软件开发和运…

pdf编辑软件有哪些?方便好用的pdf编辑软件分享

PDF文件因其跨平台、格式固定的特性&#xff0c;成为了工作、学习和生活中不可或缺的一部分。然而&#xff0c;随着需求的不断增加&#xff0c;仅仅阅读PDF文件已难以满足我们的需求&#xff0c;编辑、转换PDF文件成为了新的焦点&#xff0c;下面给大家分享几款方便好用的PDF编…

vue3处理货名的拼接

摘要&#xff1a; 货品的拼接规则是&#xff1a;【品牌】货名称/假如货品名称为空时&#xff0c;直接选择品牌为【品牌】赋值给货品&#xff0c;再选择品牌&#xff0c;会替换【品牌】&#xff1b;假如货名称为【品牌】名称&#xff0c;再选择品牌只会替换【品牌】&#xff0c;…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件&#xff0c;执行shell命令_shell在pycharm-CSDN博客 和深度学习&#xff1a;PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后&#xff0c;发现在Windows的PyCharm中直接右键运行sh文件&#xff0c;存在如下…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同&#xff0c;布隆过滤器无法删除元素&#xff0c;并且会存在一定的误判率&…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束&#xff0c;守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中&#xff0c;检查约束&#xff08;CHECK&#xff09;是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

IPC 管道 Linux环境

管道通信的特点&#xff1a; 1. 单工通信---- 任何一个时刻只能发送方 向 接收方发送数据 2. 流式传输&#xff1a; 1> 先发送的数据先被接收&#xff0c;不能跳跃式接收 ----- 顺序发送顺序接收 2> 未被接收的数据仍然滞留在管道中&#xff0c;下一次可以继续接收后…