news 2026/7/15 2:22:11

封装不同类型函数名相异的模版

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
封装不同类型函数名相异的模版

这里有一个比较好的例子,在cuda 的复数运算中,复数的加法 在 float2 类型的复数,与double2 类型的复数,函数名不同,但是已经实现过了,可以直接拿过来使用。例如 加法:cuCaddf(cuFloatComplex a, cuFloatComplex b)

cuCadd(cuDoubleComplex a, cuDoubleComplex b)

多了个 f,这是因为其为 c语言风格的函数,不能重名。

在cpp 风格的模版开发中,希望不同的函数名/cuda kernel 名 能够覆盖相同功能的运算,但这是后的。

这里的示例给出了通过 特化,实现封装的过程

hello.cu

#include "cuComplex.h" #include <stdio.h> template <typename T1, typename T2> __global__ void add(T1 *a, T1 *b, T1 *c, T2 alpha, int N) { } template<> __global__ void add<cuFloatComplex, float>(cuFloatComplex* A, cuFloatComplex* B, cuFloatComplex* C, float alpha, int N) { int i = blockIdx.x*blockDim.x + threadIdx.x; if(i<N) { C[i] = cuCaddf(C[i], cuCaddf(A[i], B[i])); C[i].x *= alpha; } } template<> __global__ void add<cuDoubleComplex, double>(cuDoubleComplex* A, cuDoubleComplex* B, cuDoubleComplex* C, double alpha, int N) { int i = blockIdx.x * blockDim.x + threadIdx.x; if(i<N) { C[i] = cuCadd(C[i], cuCadd(A[i], B[i])); C[i].x *= alpha; } } void init(cuFloatComplex* A, int N, float seed) { for(int i=0; i<N; i++) A[i] = make_cuFloatComplex(seed, seed); } void print_vector(cuFloatComplex* A, int N) { for(int i=0; i<N; i++) printf("(%3.2f,%3.2f)", A[i].x, A[i].y); printf("\n"); } int main() { cuFloatComplex* Ah = nullptr; cuFloatComplex* Bh = nullptr; cuFloatComplex* Ch = nullptr; cuFloatComplex* Ad = nullptr; cuFloatComplex* Bd = nullptr; cuFloatComplex* Cd = nullptr; int N =64; Ah = (cuFloatComplex*)malloc(N * sizeof(cuFloatComplex)); Bh = (cuFloatComplex*)malloc(N * sizeof(cuFloatComplex)); Ch = (cuFloatComplex*)malloc(N * sizeof(cuFloatComplex)); init(Ah, N, 1.0f); init(Bh, N, 2.0f); init(Ch, N, 7.0f); cudaMalloc((void**)&Ad, N*sizeof(cuFloatComplex)); cudaMalloc((void**)&Bd, N*sizeof(cuFloatComplex)); cudaMalloc((void**)&Cd, N*sizeof(cuFloatComplex)); cudaMemcpy(Ad, Ah, N*sizeof(cuFloatComplex), cudaMemcpyHostToDevice); cudaMemcpy(Bd, Bh, N*sizeof(cuFloatComplex), cudaMemcpyHostToDevice); cudaMemcpy(Cd, Ch, N*sizeof(cuFloatComplex), cudaMemcpyHostToDevice); add<cuFloatComplex, float><<<1, 64>>>(Ad, Bd, Cd, .1, N); cudaDeviceSynchronize(); cudaMemcpy(Ch, Cd, N*sizeof(cuFloatComplex), cudaMemcpyDeviceToHost); print_vector(Ch, N); return 0; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 3:21:45

为创意加注正版保障:正版字体购买实用指南

在数字创意工作中&#xff0c;字体不仅是视觉工具&#xff0c;更是受法律保护的知识产权。一次不经意的“借用”&#xff0c;可能带来令人意外的法律纠纷。本文将为你梳理购买正版字体的核心方法与决策策略&#xff0c;助你规避风险&#xff0c;让创意在安全的轨道上自由驰骋。…

作者头像 李华
网站建设 2026/7/1 9:01:38

哪款大文件传输软件最受欢迎?

在数字化工作日益普及的今天&#xff0c;无论是企业间的海量数据交换&#xff0c;还是团队内部的视频、设计稿同步&#xff0c;高效、安全地传输大文件已成为一项普遍且关键的需求。面对网络不稳定、文件体积过大、安全隐私担忧等常见痛点&#xff0c;如何选择一款合适的传输工…

作者头像 李华
网站建设 2026/7/10 23:33:29

基于RK3399Pro与RK3568的车载防撞方案:为货车泥头车安全护航

rk3399pro&#xff0c;rk3568&#xff0c;车载方案设计&#xff0c;4路AHD-1080P摄像头输入&#xff0c;防撞识别&#xff0c;助力货车泥头车安全运输&#xff01;在货运行业中&#xff0c;货车与泥头车的安全运输至关重要。今天咱就聊聊基于RK3399Pro和RK3568芯片的车载方案设…

作者头像 李华
网站建设 2026/7/9 5:35:16

2026年产品管理工具选型指南:主流工具对比与避坑清单

本文围绕产品管理工具选型&#xff0c;深度测评了 ONES、Aha!、Productboard、Jira Product Discovery、Craft.io、airfocus、ProdPad、Dragonboat、Delibr、Hygger、Linear 等 11 款工具。它们覆盖“需求洞察与优先级、产品路线图、交付对齐、产品组合治理、PRD/故事地图”等关…

作者头像 李华
网站建设 2026/7/6 23:35:05

超声波传感器(HC-SR04)与Arduino Uno及Mixly使用

【结合AI智能体学习记录】一、&#xff08;HC-SR04&#xff09;超声波传感器工作原理&#xff1a;超声波传感器和蝙蝠的定位原理一致&#xff0c;核心是通过计算超声波往返时间来换算距离&#xff1a;1. 触发发射&#xff1a;模块的Trig引脚接收到高电平信号后&#xff0c;会自…

作者头像 李华
网站建设 2026/7/1 15:53:44

风光柴储多目标联合调度问题探索

风光柴储多目标联合调度问题 联合调度分析各部分消纳比例&#xff0c;目标各部分成本最小和排放最小。 约束各部荷电状态&#xff0c;功率平衡等等在当今能源转型的大背景下&#xff0c;风光柴储多目标联合调度成为了热门话题。这种联合调度旨在实现能源的高效利用&#xff0c;…

作者头像 李华