news 2026/6/1 15:07:15

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

作者头像

张小明

前端开发工程师

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/5/23 2:52:54

2026必备!9个AI论文平台,专科生轻松搞定毕业论文!

2026必备&#xff01;9个AI论文平台&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具&#xff0c;正在重塑论文写作的未来 随着人工智能技术的不断进步&#xff0c;AI 工具已经逐渐成为学术写作中不可或缺的一部分。对于专科生而言&#xff0c;面对毕业论文的压力&…

作者头像 李华
网站建设 2026/5/30 2:16:23

设计模式--享元模式

享元模式 建议阅读&#xff1a;https://gpp.tkchu.me/flyweight.html 定义 在我们打游戏时&#xff0c;有没有想过为什么这么多的人物或者景色能被这么快的渲染出来&#xff0c;而没有丝毫卡顿&#xff08;当然GPU性能要好0.0&#xff09;。 比如说&#xff0c;求生之路的大量丧…

作者头像 李华
网站建设 2026/5/30 0:19:30

数据库笔记

SQL数据库所有数据有相同的字段名&#xff08;键&#xff09;&#xff0c;可以像表格那样存。字段名作为每一列的头。但是很明显不适合存字段为数组、列表、字典的数据。NoSQL数据库不像表格那样存的数据库。每个数据条目的成员不固定。事务把一系列操作按顺序写成一个脚本&…

作者头像 李华
网站建设 2026/5/20 18:15:56

UVM-phase中的object机制

在class uvm_phase extends uvm_object中1. 类的作用和结构这个类是 uvm_phase&#xff0c;它管理测试平台中阶段的 objection 机制。UVM 使用 objection 机制来控制仿真的执行时间&#xff0c;防止测试提前结束。核心成员&#xff1a;systemveriloguvm_objection phase_done; …

作者头像 李华
网站建设 2026/5/20 14:56:31

FeignRequestInterceptor 原理详解

FeignRequestInterceptor是 OpenFeign 的请求拦截器机制&#xff0c;其工作原理如下&#xff1a;1. 核心设计模式责任链模式&#xff1a;Feign 通过拦截器链在请求发送前和接收后执行自定义逻辑。// 拦截器接口定义 public interface RequestInterceptor {void apply(RequestTe…

作者头像 李华