news 2026/4/16 16:11:20

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

作者头像

张小明

前端开发工程师

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/4/10 4:53:06

java垃圾收集 minorgc majargc fullgc

核心概念总览 这三种 GC 类型的本质区别在于回收的堆内存区域和触发原因。GC 类型别名回收区域触发原因特点Minor GCYoung GC只回收年轻代 (Eden Survivor)Eden 区空间不足非常频繁&#xff0c;速度通常很快&#xff0c;使用复制算法Major GCOld GC只回收老年代老年代空间不足…

作者头像 李华
网站建设 2026/4/16 16:07:57

.NET 某RFID标签打印客户端 崩溃分析

崩溃分析1. 为什么会崩溃双击打开dump&#xff0c;windbg会自动定位到崩溃的上下文&#xff0c;这一点我比较喜欢&#xff0c;有的时候也省去了用 !analyze -v 无趣的等待&#xff0c;参考输出如下&#xff1a;This dump file has an exception of interest stored in it. The …

作者头像 李华
网站建设 2026/4/16 14:06:18

一站式办公平台 vs 单一即时通讯软件:企业该如何抉择?

在数字化转型的十字路口&#xff0c;企业管理者和IT负责人往往面临一个经典的选型难题&#xff1a; “我们是应该购买一个包罗万象的‘一站式办公平台’&#xff0c;还是选择一个专注极致沟通的‘单一即时通讯软件’&#xff1f;” 前者似乎能解决所有问题&#xff0c;但往往…

作者头像 李华
网站建设 2026/4/16 12:47:15

TOON:一种为大模型设计的JSON压缩型数据结构

目录 TOON&#xff1a;一种为大模型设计的JSON压缩型数据结构 一、精准定义&#xff0c;什么是 TOON&#xff1f; 1、JSON 数据格式的局限性 2、TOON 的结构与优势 3、TOON 数据结构的主要特征 4、媒体类型与文件拓展名 二、举例&#xff1a;JSON 与 TOON 描述同一组数据…

作者头像 李华
网站建设 2026/4/16 11:36:52

百考通AI:源码宝库+智能答辩,毕业季的终极“外挂”

作为一名计算机专业的学生或开发者&#xff0c;你是否经常在这样的场景中挣扎&#xff1a;毕业设计截止日期临近&#xff0c;却苦于找不到合适的项目源码作为参考&#xff1b;答辩在即&#xff0c;却要花费大量时间熬夜制作PPT。这种“白天敲代码&#xff0c;晚上做PPT”的高强…

作者头像 李华