一个 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.soDEBUG_FLAGS := -O3
#DEBUG_FLAGS := -g -gz -ggdb
HEADER_FLAGS := -MD -MF $*.d -MP all: $(TARGET)include make.src.listOBJ_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 -MPdev/icSvectorAdd_link.cu.o: dev/icSvectorAdd.cu.onvcc -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#ormake 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__ == 700x = x+y;#endif

参考:CUDA_Compiler_Driver_NVCC

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue的虚拟DOM是什么

核心思想 虚拟DOM/Virtual DOM&#xff0c;是数据驱动视图的一种解决方案。核心思想&#xff1a;使用 js对象的形式来表现html的dom结构。 背景 由于现代网络和浏览器的发展&#xff0c;网页的内容也变得很复杂&#xff0c;ajax 诞生让用户可以在不刷新页面的条件下获取到数…

ubuntu18.04安装F4PGA教程

环境搭建教程&#xff1a; f4pga-arch-defs/xilinx/xc7 at main f4pga/f4pga-arch-defs GitHub git clone https://github.com/SymbiFlow/f4pga-arch-defs.git cd f4pga-arch-defs make env cd build 主要是make env&#xff0c;会下载很多东西&#xff0c;然后生成很多描…

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

Barnes-Hut t-SNE:大规模数据的高效降维算法

在数据科学和分析中&#xff0c;理解高维数据集中的底层模式是至关重要的。t-SNE已成为高维数据可视化的有力工具。它通过将数据投射到一个较低维度的空间&#xff0c;提供了对数据结构的详细洞察。但是随着数据集的增长&#xff0c;标准的t-SNE算法在计算有些困难&#xff0c;…

【支付宝】对接手机网站支付踩坑点记录

前言 简单记录一下对接Wap支付的问题&#xff0c;alipay和wxpay认证过程差不多&#xff0c;有个体商户或企业即可&#xff0c;前者文档不易懂后者还好&#xff0c;但是wxpay门槛高&#xff0c;个人认为pc网站支付(native支付)就是为了收300认证费&#xff01; 应用公私钥 第一…

OceanBase V4.2特性解析:用 Show Trace 快速定位数据库性能瓶颈

在数据库日常运维中&#xff0c;当遇到慢SQL问题时&#xff0c;若无法迅速查明原因&#xff0c;将极大地影响用户的使用感受&#xff0c;甚至可能引发业务或服务的中断。相较于单机数据库&#xff0c;分布式数据库系统因其涉及多个节点和多组件的协同工作&#xff0c;集群规模可…

谈谈mysql中的各个关键字

1.为什么学习mysql mysql是当今最主流且开放源码的关系型数据库&#xff0c;开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;许多中小型网站为了降低…

AI论文速读 | ST-LoRA:低秩适配的时空预测

论文标题&#xff1a;ST-LoRA: Low-rank Adaptation for Spatio-Temporal Forecasting 作者&#xff1a;Weilin Ruan, Wei Chen, Xilin Dang, Jianxiang Zhou, Weichuang Li, Xu Liu, Yuxuan Liang 机构&#xff1a;香港科技大学&#xff08;广州&#xff09;&#xff0c;暨南…

全面解读可燃气体报警装置

可燃气体报警装置已成为诸多行业和家庭不可或缺的安全设施。这些装置能够实时监测环境中可燃气体浓度&#xff0c;及时发出警报&#xff0c;有效预防火灾、爆炸等重大安全事故的发生。然而&#xff0c;要确保报警装置发挥其应有的功效&#xff0c;正确、规范的安装至关重要。 …

Vue3:响应式数据的基本使用(ref、reactive)

一、前言 在Vue3中&#xff0c;如果数据不是响应式数据&#xff0c;当数据的值发生改变时&#xff0c;页面上的数据是不会发生改变的。因此本文主要介绍Vue3中响应式数据的使用&#xff0c;包括ref和reactive的基本使用。 二、ref 1、ref —— 创建基本类型的响应式数据 re…

第100+6步 ChatGPT文献复现:ARIMAX预测新冠

基于WIN10的64位系统演示 一、写在前面 我们继续来解读ARIMAX模型文章&#xff0c;这一轮带来的是&#xff1a; 《PLoS One》杂志的2022年一篇题目为《A data-driven eXtreme gradient boosting machine learning model to predict COVID-19 transmission with meteorologic…

【Java】HOT100 回溯

目录 理论基础 一、组合问题 LeetCode77&#xff1a;组合 LeetCode17&#xff1a;电话号码的字母组合 LeetCode39&#xff1a;组合总和 LeetCode216&#xff1a;组合总和ii LeetCode216&#xff1a;组合总和iii 二、分割问题 LeetCode131&#xff1a;分割回文串 Leet…