一个 cuda shared library 的通用Makefile

0. 文件结构

device 模版函数放在 library/dev/include/*.cuh

模版的实例化和调用封装在 library/dev/*.cu

针对主机代码调用dev 函数而提供的头文件放在 library/dev/*.h, 也就是*.cu中主机函数的声明;

业务逻辑放置在 lib/src/*.cpp中,调用library/dev/*.cu中的函数实现加速,并dafault visible 出去,供第三方调用(#define API_ __attribute__((visibility("default"))));

一个 cuda shared library 的通用Makefile

1,源码

library/Makefile

TARGET := libicarithmetic.so

DEBUG_FLAGS := -O3
#DEBUG_FLAGS := -g -gz -ggdb
HEADER_FLAGS := -MD -MF $*.d -MP 

all: $(TARGET)

include make.src.list

OBJ_CPP := $(SRC_CPP:.cpp=.cpp.o)
DEP_CPP := $(SRC_CPP:.cpp=.cpp.d)

OBJ_CU  := $(SRC_CU:.cu=.cu.o) 
DEP_CU  := $(SRC_CU:.cu=.cu.d)

CPP_FLAGS := $(DEBUG_FLAGS) -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wno-unused-result -Werror=vla
INC_CPP   := -I./include/internal
LD_FLAGS  := -L/usr/local/cuda/lib64 -lcudart -lcudadevrt

# -Werror=vla -fvisibility=hidden -fvisibility-inlines-hidden  -Wno-unused-result
CU_FLAGS := -Xcompiler -fPIC 
INC_CU   :=
GPU_ARCH ?= -gencode arch=compute_60,code=sm_60 -gencode arch=compute_70,code=sm_70 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_80,code=sm_80 -gencode arch=compute_80,code=compute_80

#-arch=sm_70
#CPP compiler
CXX := g++
#device code compiler
DXX := nvcc

-include $(DEP_CPP)
-include $(DEP_CU)

%.cpp.o: %.cpp
	$(CXX) $(CPP_FLAGS) $(INC_CPP) $< -c -o $@ -MMD -MF $*.cpp.d -MP 

#-MMD --generate-nonsystem-dependencies-with-compile 
#-MF --dependency-output
#-MP --generate-dependency-targets  
%.cu.o: %.cu
	$(DXX) $(GPU_ARCH) $(CU_FLAGS) $(INC_CU) $< -c -o $@ -MMD -MF $*.cu.d -MP
	
#--generate-nonsystem-dependencies-with-compile --dependency-output $*.cu.d --generate-dependency-targets

# -MD -MF $*.cu.d -MP

dev/icSvectorAdd_link.cu.o: dev/icSvectorAdd.cu.o
	nvcc -Xcompiler -fPIC $(GPU_ARCH) -dlink -o $@ $< $(LD_FLAGS)

$(TARGET): $(OBJ_CPP) $(OBJ_CU) dev/icSvectorAdd_link.cu.o
	$(CXX) -shared $^ -o $@


.PHONY: clean
clean:
	rm -rf $(OBJ_CPP) $(OBJ_CU) $(TARGET) $(DEP_CPP) $(DEP_CU) dev/icSvectorAdd_link.cu.o

#$(SRC_C:.c=.d)

2,用法

同一份shared lib 支持多种架构的编译方式:

make

#or

make GPU_ARCH="-gencode arch=compute_60,code=sm_60 -gencode arch=compute_70,code=sm_70"

3,扩展

上述Makefile可以为同一份cuda 代码分别生成不同的架构的二进制文件,但是如果想为每个架构使用不同的cuda代码,这个Makefile就做不到了。

这时需要使用 nvcc编译器内置的宏:

__CUDA_ARCH__

比如,为 sm_70写的代码
 

#if __CUDA_ARCH__ == 700

x = x+y;

#endif

参考:CUDA_Compiler_Driver_NVCC

某种意义上类似于做了如下分开的编译:

nvcc  -cubin   -arch=sm_70  -D__CUDA_ARCH__=700   icSvectorAdd.cu   -o   icSvectorAdd.sm70.cubin

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenWRT磁盘扩容(PVE虚拟机方案)

官方扩容指导文档 PVE给虚拟机磁盘扩容 给虚拟机磁盘扩容&#xff0c;选中OpenWRT的硬盘&#xff0c;随后选择调整大小 输入增量大小&#xff0c;即增加多少磁盘空间给硬盘。这里我选择增加4G 进入OpenWRT控制台界面安装一些linux常用查看磁盘的工具&#xff08;也可以通过网…

Tensorflow2.0笔记 - BatchNormalization

本笔记记录BN层相关的代码。关于BatchNormalization&#xff0c;可以自行百度&#xff0c;或参考这里&#xff1a; 一文读懂Batch Normalization - 知乎神经网络基础系列&#xff1a; 《深度学习中常见激活函数的原理和特点》《过拟合: dropout原理和在模型中的多种应用》深度…

Web前端 JavaScript笔记7

js的执行机制 js是单线程 同步&#xff1a;前面一个任务执行结束之后&#xff0c;执行后一个 异步&#xff1a;异步任务&#xff0c;引擎放在一边&#xff0c;不进入主线程&#xff0c;而进入任务队列的任务 js通过浏览器解析&#xff0c;浏览器靠引擎解析 回调函数同步任务执行…

17.Nacos与Eureka区别

Nacos会将服务的提供者分为临时实例和非临时实例。默认为临时实例。 临时实例跟eureka一样&#xff0c;会向注册中心报告心跳监测自己是否还活着。如果不正常了nacos会剔除临时实例。&#xff08;捡来的孩子&#xff09; 非临时实例&#xff0c;nacos会主动询问服务提供者是否…

【YOLOv8改进[注意力]】YOLOv8添加DAT(Vision Transformer with Deformable Attention)助力涨点

目录 一 DAT 二 YOLOv8添加DAT助力涨点 1 总体修改 2 配置文件 3 训练 其他 一 DAT 官方论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Xia_Vision_Transformer_With_Deformable_Attention_CVPR_2022_paper.pdf Transformers最近在各种视…

BBS前后端混合项目--01

总路由 # urls.py """BBS1 URL ConfigurationThe urlpatterns list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views1. Add an import: from my_app import views2…

上网行为管理软件有哪些?三款常用上网行为管理软件评测

互联网的普及&#xff0c;企业和个人对于网络安全和信息保护的需求越来越高。为了确保网络环境的安全和稳定&#xff0c;上网行为管理软件应运而生。本文将对三款常用的上网行为管理软件进行评测&#xff0c;分别是域智盾、Splunk Enterprise Security和安企神。 1、域智盾 域…

什么是正向代理和反向代理

正向代理和反向代理是两种不同的代理服务器配置方式&#xff0c;它们在代理的方向和作用上有所不同。 一、正向代理&#xff08;Forward Proxy&#xff09; 代表客户端发送请求到其他服务器的代理服务器。客户端将请求发送给正向代理服务器&#xff0c;然后由正向代理服务器代…

Facebook的区块链应用深度分析

去中心化身份验证的意义 在当今数字化社会中&#xff0c;身份验证的重要性不言而喻。对于Facebook这样的大型社交媒体平台来说&#xff0c;确保用户的身份真实性和数据的安全性是至关重要的。传统的中心化身份验证方式存在一定的安全风险和可信性问题&#xff0c;而去中心化身…

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮&#xff0c;随后谷歌推出了自己的AI聊天机器人Bard&#xff0c;紧接着微软推出了Bing Chat&#xff0c;百度也推出了文心一言&#xff0c;这些聊天机器人的推出&#xff0c;标志着对话式AI技术已经达到了一个…

windows系统下python解释器安装

一. 简介 本文简单学习一下python开发学习中&#xff0c;所使用到的 python解释器的下载安装。后面再学习下载安装python的 IDE开发工具&#xff0c;这里要安装的python的 IDE开发工具为 PyCharm。 二. Windows系统下python解释器与IDE开发工具下载安装 1. python解释器下载…

大型集团企业 怎么实现多区域文件交换?

很多大型集团企业&#xff0c;都会在全国各地&#xff0c;甚至海外&#xff0c;都设立分支机构&#xff0c;还有银行、邮政这类机构&#xff0c;都会在全国各地设立多个支行和网点&#xff0c;所以在日常经营过程中&#xff0c;都会存在多区域文件交换的场景。 大型集团企业在进…

嵌入式Linux八股(三)——计算机基础

三、计算机基础 01.操作系统 01.进程几种状态 02.锁 互斥锁&#xff1a;互斥锁是一种用于线程同步的工具&#xff0c;能够保证同一时刻只有一个线程可以访问共享资源。如果一个线程已经取得了互斥锁&#xff0c;其他尝试获得该锁的线程将会被阻塞&#xff0c;直到第一个线程…

Spring与SpringBoot在配置读取方式上的区别

1. 问题说明 将Springboot项目中自定义的一个扩展工具类移植到Spring框架项目中的时候发现一个问题。在springboot中application.yml中的配置内容可以从Environment中获取&#xff0c;但是在spring中context:placeholder对应的配置文件中的配置却无法从Environment中获取。为了…

Power BI 如何创建页面导航器?(添加目录按钮/切换页面按钮)

Power BI 中页导航是什么&#xff1f; 在Power BI中&#xff0c;页导航&#xff08;Page Navigation&#xff09;是指在报告中创建多个页面&#xff08;页&#xff09;&#xff0c;然后允许用户在这些页面之间进行导航的功能。 如下图所示&#xff0c;页导航的选项和报告中的…

每日两题 / 438. 找到字符串中所有字母异位词 238. 除自身以外数组的乘积(LeetCode热题100)

438. 找到字符串中所有字母异位词 - 力扣&#xff08;LeetCode&#xff09; 记录p串每个字符出现次数 维护与p串等长的滑动窗口&#xff0c;记录其中每个字符的出现次数 每次滑动后将当前次数与p串的次数比较即可 class Solution { public:vector<int> findAnagrams(s…

软件项目经理需要具备这 11 个能力

当前软件开发技术更新换代越来越快&#xff0c;各种项目实施管理思想也日新月异&#xff0c;作为一个软件项目经理&#xff0c;需要具备这 11 种能力&#xff1a; 1. 项目管理能力 了解项目管理的基本原则和方法&#xff0c;包括制定项目计划、资源分配、风险管理、问题解决和…

JAVA:Kettle 强大的开源ETL工具

请关注微信公众号&#xff1a;拾荒的小海螺 1、简述 Kettle&#xff08;Pentaho Data Integration&#xff09;&#xff1a;强大的开源ETL工具Kettle&#xff0c;又称作Pentaho Data Integration&#xff0c;是一款流行的开源ETL&#xff08;Extract, Transform, Load&#x…

【Unity实战】值得关注的Addressable新特性

如果您是最近起的Unity项目且有用到Addressable作为内容管理&#xff0c;你可能需要注意一下1.21.15版本的变化&#xff1a; [1.21.15] - 2023-08-03 Fixed an issue where using binary catalogs causes a crash on Android with ARM7.DownloadDepedenciesAsync no longer l…

基于RT-Thread的智能家居助手

一、项目简介 智能家居助手主要基于RT-Thread开发的&#xff0c;该系统主要分为语音子系统&#xff0c;环境监测子系统&#xff0c;智能控制子系统&#xff0c;智能网关子系统&#xff0c;音乐播放器&#xff0c;云端以及应用软件七大部分。语音子系统可通过语音进行人机交互来…