cuda核函数传入__device__函数指针的使用例子

2023-10-27

cuda的global函数里面可以调用__device__函数,在有特殊需要的时候,还可以把__device__函数作为参数传入到一个__global__函数中
在cuda里面不能像c++那样简单地传入函数的指针,需要在传入前对函数的指针做一些包装。
例如

typedef double(*funcFormat)(int,char);

这里面double表示函数的返回值,int,char是函数的参数列表,所有满足这种格式的函数都可以用这种函数类型指代。
上面的funcFormat是一种函数类型,在这里可以把它理解成一种数据类型,从此funcFormat代表的就是double(*)(int,char),后面声明__global__核函数的参数的时候,也直接使用furcFormat就行。
根据需要写好一个__device__函数之后,例如这样

__device__ double testFunc(int x,char y)
{
    //to do
}

这个函数testFunc仍然不能直接使用,需要用上面typedef出来的数据类型,把它声明成静态的函数指针

__device__ funcFormat staticTestFunc=testFunc;

,即使是这样,它仍然不能被直接使用,在传入函数指针的时候还需要把它转换成一个host函数指针,用cuda提供的cudaMemcpyFromSymbol接口来转换。

cudaMemcpyFromSymbol(&hostFunc,staticTestFunc,sizeof(funcFormat));

下面是一个具体的例子

#include<iostream>

//声明函数指针的类型
typedef double(*funcFormat)(int);

__device__ double testFunc(int x)
{
    return x*2+1;
}

//把函数指针声明成静态指针
__device__ funcFormat staticTestFunc=testFunc;

__global__ void cudaTest(double* gpuData,funcFormat func)
{
    gpuData[threadIdx.x]=(*func)(threadIdx.x);
}

int main()
{
    double* gpuData;
    cudaMalloc((void**)&gpuData,sizeof(double)*10);
    //新建一个位于host的同样的函数类型
    funcFormat hostFunc;
    //把之前指定过的静态指针复制到host部分
    cudaMemcpyFromSymbol(&hostFunc,staticTestFunc,sizeof(funcFormat));
    cudaTest<<<1,10>>>(gpuData,hostFunc);
    //把数据复制到cpu内存里面
    double cpuData[10];
    cudaMemcpy(cpuData,gpuData,sizeof(double)*10,cudaMemcpyDeviceToHost);
    for(int i=0;i<10;++i) std::cout<<cpuData[i]<<std::endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda核函数传入__device__函数指针的使用例子 的相关文章

  • 蓝桥杯零基础冲过赛-第22天

    注意 因为蓝桥杯大部分题目都会涉及到数据规模过大问题 所以大整数是解决数据规模过大的问题的其中一种最简便的方式 核心 竖式个位对齐原理 文章目录 大整数加法 大整数减法 大整数乘法 大整数除法 大整数余数 大整数加法 意义 因为数据类型有s
  • 摸鱼时间少? 是时候学会用Vue自定义指令进行业务开发了

    文章目录 前言 一 博主用Vue自定义指令在业务中实现了什么需求 1 首屏Loading切换指令 用来占位 支持调节Loading样式 2 复制指令 3 文件流形式下载后端数据 转blob下载 4 防抖 支持设置延迟时间 5 按钮或菜单权限
  • 永远怀念左耳朵耗子陈皓——IT界的失去

    2023年 中国IT界遭遇了一次巨大的损失 左耳朵耗子陈皓先生的离世让人震惊和悲伤 作为一位杰出的技术专家和开源倡导者 他为IT界做出了卓越贡献 本文将回顾他的职业生涯和他对IT界的重要影响 以及他离世后的深远意义 第一部分 IT界的璀璨明
  • Opencv

    Opencv 检测框线 模糊判断 计算图片相似度 开操作检测横竖线 拉普拉斯方差判断模糊度 直方图统计判断图片相似性 开操作检测横竖线 开操作是先选定合适结构元对图像进行腐蚀处理再用相同结构元对图像进行膨胀处理 开操作可以平滑物体轮廓 断开
  • C++并发编程(5):std::unique_lock、互斥量所有权传递、锁的粒度

    std unique lock lt gt 灵活加锁 参考博客 线程间共享数据 使用互斥量保护共享数据 C 多线程unique lock详解 多线程编程 五 unique lock 相较于std lock guard std unqiue
  • iOS - 线程中常见的几种锁

    线程锁主要是用来解决 共享资源 的问题 实际开发中或多或少的都会用到各类线程锁 为了线程的安全我们有必要了解常见的几种锁 下面是本人查看一些大牛的博客然后整理的内容 加上自己的一些见解 水平有限 如果不慎有误 欢迎交流指正 常见锁列举 自旋
  • OpenStack 学习笔记(一) 概况

    偶然机会 需要了解一下OpenStack的概况 因此与几个同事一起看了一下 此学习笔记是记录一下学习的知识点 备自己以后回顾复习 一 OpenStack 概况 OpenStack是一个由NASA 美国国家航空航天局 和Rackspace合作
  • python处理wav文件时出现error:X和Y不在同一维度

    python处理wav文件时出现error X和Y不在同一维度 ValueError x and y must have same first dimension but have shapes 1290240 and 2580480 记录
  • Python 动态规划解决不同路径问题

    目录 一 LeetCode 62 不同路径 1 题目描述 2 解题思路 3 代码 二 LeetCode 63 不同路径II 1 题目描述 2 解题思路 3 代码 三 LeetCode 64 最小路径和 1 题目描述 2 解题思路 3 代码
  • 初识Django

    虚拟环境 python pip install Virtualenv pip install Virtualenvwrapper win workon 查看当前虚拟环境 mkvirtualenv xx 创建虚拟环境xx 默认的虚拟环境存放的
  • 编译系统总结篇-Android10.0编译系统(十一)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • Linux CentOS7 添加中文输入法

    在安装CentOS7时 现在默认安装了桌面中文系统 可以切换为英文 中英文可以按要求随时更换 而在CentOS7桌面环境下 显示中文非常方便 正确 但不能录入中文 在远程登录系统的情况下 不论是系统语言 LANG 设置为中文或英文 都可以在
  • 获取lib库中Filler/buffer/CK单元的类型——innovus

    1 Filler的所有类型 命令 dbGet dbGet head allCells name FIL p name 2 BUFFER的所有类型 命令 dbGet dbGet head allCells name BUF p name 3
  • 实时时钟芯片DS1302

    一 DS1302主要介绍 1 DS1302 的特点 DS1302 是 DALLAS 达拉斯 公司推出的一款涓流充电时钟芯片 DS1302 实时时钟芯片广泛应用于电话 传真 便携式仪器等产品领域 它的主要性能 指标如下 1 DS1302 是一
  • 正则校验-我需要的正则表达式知识

    正则校验 我需要的正则表达式知识 正则表达式由正则表达式引擎提供支持 不同编程环境有不同的正则表达式引擎 在实际使用正则表达式的过程中会有一些差别 什么是正则表达式 正则表达式是用于描述匹配复杂字符串规则的工具 一个正则表达式对应着一个文本
  • Mybatis基础知识浅谈

    Mybatis浅谈 目录 1 什么是Mybatis 2 Mybatis的快速入门 2 1MyBatis开发步骤 2 2 环境搭建 3 MyBatis的增删改查操作 3 1 MyBatis的插入数据操作 3 2 MyBatis的修改数据操作
  • 可执行文件的格式(ELF格式)详解

    各种讲解elf文件格式一上来就是各种数据类型 看了半天却不知道这些数据类型是干啥的 所以咱就先找个例子直接上手 这样对elf文件格式有个具体而生动的了解 然后再去看那些手册 就完全不惧了 我们使用一个汇编程序max s并对其进行编译链接产生
  • vant 使用deep修改样式不好使解决方案

  • php7 libevent扩展,PHP7 安装event扩展的实现方法

    Libevent 是一个用C语言编写的 轻量级的开源高性能I O框架 支持多种 I O 多路复用技术 epoll poll dev poll select 和 kqueue 等 支持 I O 定时器和信号等事件 注册事件优先级 PHP提供了
  • 【牛客】四选一多路器

    描述 制作一个四选一的多路选择器 要求输出定义上为线网类型 状态转换 d0 11 d1 10 d2 01 d3 00 信号示意图 波形示意图 输入描述 输入信号 d1 d2 d3 d4 sel 类型 wire 输出描述 输出信号 mux o

随机推荐

  • 前端面试题之React

    文章目录 1 React生命周期 V16 3 之前 挂载阶段 组件更新阶段 卸载阶段 新增后 挂载阶段 更新阶段 static getDerivedStateFromProps shouldComponentUpdate render ge
  • SSM myBatis 配置及自动生成Bean 和 Dao

    因为我发现在做SSM 的配置的时候 配置中出现一点问题都会导致项目打包失败或者其他问题 但是我发现网上很多都没有贴出每个配置文件的代码 如果是新手在配置上就会走很多的弯路 所以这里我贴出所有配置文件的代码 这样会方便很多新手快速的构建正确的
  • Arduino控制舵机

    一 舵机一般有三根线 和Arduino连接一般如下 二 代码分析 include
  • 为什么我们使用Story Points进行估算?

    故事点 Story Points 简介 Scrum指南告诉我们 估算应该由将要完成工作的人提供 但它并没有告诉我们应该如何提供估算 它把这个决定留给了我们 Scrum团队使用的一种常见策略是使用称为故事点的度量单位进行估算 但为什么要使用S
  • hive的row_number()、rank()和dense_rank()的区别以及具体使用

    row number rank 和dense rank 这三个是hive内置的分析函数 下面我们来看看他们的区别和具体的使用案例 首先创建一个文件test A 1 B 3 C 2 D 3 E 4 F 5 G 6 1 2 3 4 5 6 7
  • 国际化字符编码处理总结

    在处理国际化时 处理不当就会产生乱码 通用的做法是都转换为UTF 8编码 对于高层开发语言十分简单 对于底层编程语言则有些复杂 其中涉及的概念也有很多 字符是指计算机中使用的字母 数字 字和符号 包括 1 2 3 A B C 等等 在 AS
  • ‘‘‘python‘‘‘内置函数

    目录 关键字 class 定义类 内置函数 和定义函数的调用一致 常用方法 字符串的方法
  • lua/luci入门

    lua 注释 单行注释 多行注释 数据类型可以用type函数判断 nil 未使用过的变量 既是值 也是类型 boolean string number 相当于c里的double table 唯一的数据结构 基本与php数组类型同 索引数组从
  • openwrt之Uci

    Openwrt中所有的配置文件都存放再 etc config中 uci是openwrt中用来修改配置文件的一个软件 一 配置文件的格式 config声明一个section example 指的是section的type 也就是类型 test
  • C++ 多语言切换

    如果设置UI资源文件非重点不做介绍 设置英文版接口 SetThreadUILanguage MAKELANGID LANG ENGLISH SUBLANG ENGLISH US 此时如果操作系统的语言选择的是简体中文 那么掉系统的AfxMe
  • 已解决(Python3中pip无法安装urllib报错问题)No matching distribution found for urllib

    已解决 Python3中pip无法安装urllib报错问题 ERROR Could not find a version that satisfies the requirement urllib from versions none ER
  • selenium 下载文件取消安全下载的配置

    使用 selenium 下载碰见的问题 文件存在危险 因此 Chrome 已将其拦截 查找了很多配置文件都无法解决这个问题 经过多次测试 下面的参数配置可以解决这个问题 selenium 下载文件取消安全下载的配置 如果想要下载文件 可以添
  • MATLAB/Simulink 永磁同步电机启动(I/F控制) 中高速运行(滑模观测器控制/磁链观测器)

    MATLAB Simulink 永磁同步电机启动 I F控制 中高速运行 滑模观测器控制 磁链观测器 运行模式间切换方案设计 性能要求 价格等方面请加好友 卡尔曼滤波器加锁相环 ID 1628564485704566696Elaine
  • java jen部署_CSS布局:Jen Simmons的网格,区域和@Supports

    java jen部署 In this episode of the Versioning Show Tim and David are joined by Jen Simmons Designer Advocate at Mozilla a
  • Python3 基础语法练习小Demo

    文章目录 反恐精英基础版 分析 代码实现 反恐精英修复版 分析 代码实现 反恐精英加强版 分析 代码实现 反恐精英超级加强版 分析 代码实现 反恐精英基础版 一个精英对一个匪徒 分析 定义人类 描述公共属性 life 100 name 姓名
  • 自定义开发成绩查询小程序

    在当今数字化时代 教育行业借助技术手段提高教学效果 作为老师 拥有一个自己的成绩查询系统可以帮助你更好地管理学生成绩 并提供更及时的反馈 本文将为你详细介绍如何从零开始搭建一个成绩查询系统 让你的教学工作更加高效和便捷 不过比较便捷好用的方
  • [人工智能-深度学习-44]:开发环境 - Anaconda的目录结构与SourceInsight工程

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121309970 目录 第1章 前言
  • 如何在Ubuntu系统中使用Traefik为容器设置反向代理?

    Traefik 是一种为 docker 容器建立反向代理的现代方法 当您希望在 docker 容器中运行多个应用程序 并公开端口 80 和 443 时 traefik 可能是反向代理的最佳选择 Traefik 提供了自己的监控仪表板 您还可
  • Visual Studio Code输出窗口中文乱码

    Visual Studio Code输出窗口中文乱码 Visual Studio Code输出窗口中文乱码 为了防止自己以后又忘记 只能自己写文章记下来 区别VS Code和VS 1 vs2019是个IDE vscode本质上是个编辑器 只
  • cuda核函数传入__device__函数指针的使用例子

    cuda的global函数里面可以调用 device 函数 在有特殊需要的时候 还可以把 device 函数作为参数传入到一个 global 函数中 在cuda里面不能像c 那样简单地传入函数的指针 需要在传入前对函数的指针做一些包装 例如