在C++ class 中使用CUDA(包含texutre 2d的使用)

CUDA纹理内存tex1D/tex2D/tex3D函数 如果纹理数据是聚合的,则可以使用tex1Dgather函数来替代tex1D函数。CUDA的tex1D是用于从一维纹理中读取数据的函数。tex2D函数可以用于从二维纹理中读取数据。如果纹理数据是二维的,则可以使用tex2D函数来替代tex1D函数。如果纹理数据是三维的,则可以使用tex3D函数来替代tex1D函数。使用tex2D函数取代tex1D函数可以提高性能,因为纹理数据是二维的,因此可以使用更少的纹理坐标来读取数据。tex1D函数可以用于从纹理中读取各种类型的数据,包括浮点数、整数和字符串。 阅读详情
一直想写一下global内存访问的文章,但是最近的事情太多,哎昨天。。。,今天的一篇paper也被拒了~~哎--
不过收到一个QQ群朋友( from this AVerMedia TECHNOLOGIES(Suzhou), Inc. )求助邮,看得出来项目比较棘手,应该是对CUDA的使用有些不清楚;
晚上熬夜写了一个简单的C++ class 封装CUDA的demo,里面涉及到了texture的使用,希望对他的CUDA学习有帮助:
下面是三部分的代码
1. 调用class的sample.cu 文件这里没多少好解释的,就是直接生产一个cuda的class实例,然后调用各个方法
  1. /********************************************************************
  2. *  sample.cu
  3. *  This is a example of the CUDA program.
  4. *  author: zhao.kaiyong(at)gmail.com
  5. *  http://www.comp.hkbu.edu.hk/~kyzhao/
  6. *********************************************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <cuda_runtime.h>
  10. #include <cutil.h>
  11. #include "cuda_class.h"
  12. /************************************************************************/
  13. /* HelloCUDA                                                            */
  14. /************************************************************************/
  15. int main(int argc, char* argv[])
  16. {
  17.     cuda_class cudaA;
  18.     if(!cudaA.InitCUDA()) {
  19.         return 0;
  20.     }
  21.     float   host_data[22] = {0};
  22.     float   host_result[11] ={0};
  23.     for (int i = 0; i < 22; i++)
  24.     {
  25.         host_data[i] = i;
  26.     }
  27.     cudaA.InitTexture(host_data, 11, 2);
  28.     cudaA.MallocMemA(11);
  29.     unsigned int timer = 0;
  30.     CUT_SAFE_CALL( cutCreateTimer( &timer));
  31.     CUT_SAFE_CALL( cutStartTimer( timer));
  32.     cudaA.DoWork();
  33.     CUDA_SAFE_CALL( cudaThreadSynchronize() );
  34.     CUT_SAFE_CALL( cutStopTimer( timer));
  35.     printf("Processing time: %f (ms)/n", cutGetTimerValue( timer));
  36.     CUT_SAFE_CALL( cutDeleteTimer( timer));
  37.     cudaA.TranslateResult(host_result);
  38.     cudaA.ReleaseMem();
  39.     for (int i = 0; i < 11; i++)
  40.     {
  41.         printf("%f /n", host_result[i]);
  42.     }
  43.     CUT_EXIT(argc, argv);
  44.     return 0;
  45. }

2. 两个class 文件
  1. /********************************************************************
  2. *  cuda_class.h
  3. *  This is a example of the CUDA program.
  4. *  author: zhao.kaiyong(at)gmail.com
  5. *  http://www.comp.hkbu.edu.hk/~kyzhao/
  6. *********************************************************************/
  7. #ifndef __CUDA_CLASS_H__
  8. #define __CUDA_CLASS_H__
  9. #include <cutil.h>
  10. class cuda_class
  11. {
  12. public:
  13.     cuda_class(void);
  14.     ~cuda_class(void);
  15.     int InitCUDA();
  16.     int MallocMemA(int len);
  17.     int InitTexture(float* init_data,int w, int h);
  18.     int DoWork();
  19.     int TranslateResult(float* out_data);
  20.     int ReleaseMem();
  21.     int ReleaseTex();
  22. private:
  23.     float   *device_result;
  24.     cudaArray* device_tex;
  25.     int m_ret_len;
  26. };
  27. #endif // __CUDA_CLASS_H__
  1. /********************************************************************
  2. *  cuda_class.cu
  3. *  This is a example of the CUDA program.
  4. *  author: zhao.kaiyong(at)gmail.com
  5. *  http://www.comp.hkbu.edu.hk/~kyzhao/
  6. *********************************************************************/
  7. #include "cuda_class.h"
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <cuda_runtime.h>
  11. #include <cutil.h>
  12. texture<float, 2, cudaReadModeElementType> tex;
  13. /************************************************************************/
  14. /* Example                                                              */
  15. /************************************************************************/
  16. __global__ static void HelloCUDA(float* result, int num)
  17. {
  18.     int i = 0;
  19.     for(i = 0; i < num; i++) {
  20.         result[i] = tex2D(tex,(float) i,0) + tex2D(tex,(float)i,1);
  21.     }
  22. }
  23. cuda_class::cuda_class(void)
  24. {
  25. }
  26. cuda_class::~cuda_class(void)
  27. {
  28. }
  29. int cuda_class::InitCUDA()
  30. {
  31.     /************************************************************************/
  32.     /* Init CUDA                                                            */
  33.     /************************************************************************/
  34. #if __DEVICE_EMULATION__
  35.     return true;
  36. #else
  37.     int count = 0;
  38.     int i = 0;
  39.     cudaGetDeviceCount(&count);
  40.     if(count == 0) {
  41.         fprintf(stderr, "There is no device./n");
  42.         return false;
  43.     }
  44.     for(i = 0; i < count; i++) {
  45.         cudaDeviceProp prop;
  46.         if(cudaGetDeviceProperties(∝, i) == cudaSuccess) {
  47.             if(prop.major >= 1) {
  48.                 break;
  49.             }
  50.         }
  51.     }
  52.     if(i == count) {
  53.         fprintf(stderr, "There is no device supporting CUDA./n");
  54.         return false;
  55.     }
  56.     cudaSetDevice(i);
  57.     printf("CUDA initialized./n");
  58.     return true;
  59. #endif
  60. }
  61. int cuda_class::MallocMemA(int len)
  62. {
  63.     m_ret_len = len;
  64.     CUDA_SAFE_CALL( cudaMalloc((void**) &device_result, sizeof(float) * m_ret_len));
  65.     return 1;
  66. }
  67. int cuda_class::DoWork()
  68. {
  69.     HelloCUDA<<<1, 1, 0>>>(device_result, m_ret_len);
  70.     CUT_CHECK_ERROR("Kernel execution failed/n");
  71.     return 1;
  72. }
  73. int cuda_class::TranslateResult(float * out_data)
  74. {
  75.     CUDA_SAFE_CALL( cudaMemcpy(out_data, device_result, sizeof(float) * m_ret_len, cudaMemcpyDeviceToHost));
  76.     return 1;
  77. }
  78. int cuda_class::ReleaseMem()
  79. {
  80.     CUDA_SAFE_CALL( cudaFree(device_result));
  81.     CUDA_SAFE_CALL( cudaFreeArray(device_tex));
  82.     CUDA_SAFE_CALL( cudaUnbindTexture(tex));
  83.     return 1;
  84. }
  85. int cuda_class::InitTexture(float* init_data, int w, int h)
  86. {
  87.     cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
  88.     CUDA_SAFE_CALL( cudaMallocArray(&device_tex, &channelDesc, w, h));
  89.     CUDA_SAFE_CALL( cudaMemcpyToArray(device_tex, 0, 0, init_data, sizeof(float)* w*h , cudaMemcpyHostToDevice));
  90.     CUDA_SAFE_CALL( cudaBindTextureToArray(tex, device_tex, channelDesc));
  91.     return 1;
  92. }
这里需要做个解释,现在CUDA的cu文件是可以直接按照c++方式编译的,这个得在nvcc的编译选项里面可以设定为--host-compilation C++,在默认的情况下,以前2.0版本以前都是按照C格式编译文件,现在都是会按照C++方式编译文件,所以这里可以直接用cu文件来写Class。

在编译的时候,需要加上/MTd(debug), /MT(Release)版本,这里是告诉xcompiler选项,支持C++的runtime库,不然会有一些lib 访问冲突。

下面是下载整个工程的下载连接:不过release版本编译选项没设置,这就留给大家自己熟悉环境吧~~不要问我怎么设置……
http://download.youkuaiyun.com/user/OpenHero
cuda_cpp_class_texture_demo.rar

应该对C++和texture比较迷茫的朋友有一些帮忙.


rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ckelvin%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Ckelvin%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Ckelvin%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">
Cuda函数调用 cuda的基础函数说明 阅读详情

相关推荐

告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建可维护的UI自动化项目

UI自动化测试是软件质量保障的关键环节,其核心在于模拟用户操作,对Web应用界面进行功能验证。传统的脚本堆砌方式常因代码耦合度高、维护成本大而难以为继。工程化解决方案通过分离关注点,将测试逻辑、数据和配置解耦,从而显著提升项目的可读性、可维护性和可扩展性。其技术价值在于构建可持续运行的自动化资产,而非一次性脚本。典型的应用场景包括Web应用的回归测试、兼容性测试及CI/CD流水线中的质量门禁。本文以Playwright、Pytest、Yaml和Allure为核心技术栈,详细阐述了如何从项目架构、页面对象模型

weixin_42529328的博客 299

CUDA 中使用类对象 数据结构sizeof不一致问题

CUDA__global__ 函数中: 执行sizeof( class ) 的结果与 __host__中结果不一致,经分析,是由于类是继承于一个基类,且他的一个成员也是继承于同一基类: 如下: class A0 { } class A1 { } class B0: public A0 { double v; } class B1: public A0 { B0 v; } B1 的size就是 sizeof(B0)+8=16 class B2: public A1 { .

zlq1233217的专栏 485

抖音__NS_sig3签名机制解析与动态Hook实战

在现代移动应用中,客户端与服务端之间的可信通信契约往往依赖于动态生成的请求签名,如抖音(某手)的__NS_sig3参数。该签名并非简单哈希,而是融合设备指纹、传感器数据、运行时上下文与轻量加密的综合摘要,体现了‘环境即凭证’的安全设计思想。其核心价值在于抵御静态伪造与批量模拟,提升接口调用的真实性与不可复用性。典型应用场景包括Feed流加载、点赞关注等关键业务接口的身份校验。本文基于真实逆向与Frida动态Hook实践,深入解析__NS_sig3的so层实现逻辑、JNI调用链路、输入参数真实性验证机制,以及

weixin_30127995的博客 375

CUDA编程二、C++和cuda混合编程的一些基础知识点

上一篇博客,介绍了GPU结构和cuda编程的一些基础知识,最后用cuda实现了向量加法。这一篇博客中主要是学习C++和cuda混合编程的一些知识点,一是C++代码执行的过程,二是C++和cuda混合编程的实现。​​​​​​​。

HUSTHY的博客 2896

SAP License USMM SLAW2 SAP审计

引言 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安装的SAP系统需要进行测定。 关键字: SAP License、 SAP USMM、 SLAW2、 SAP 账号、SAP 账号审计、 SAP License 审计、 SAP 审计报告、SAP 账号优化 SAP License审计邮件 企业每年都会收到SAP License审计邮件,邮件内容大致就是根据贵公司与SAP签定的合同XXX条款规定,贵公司所安...

感悟人生 2978

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

cuda:编程实践-2

问题代码: class A { public: __global__ static void kernel(); }; __global__ void A::kernel() {} 代码拥有两个问题,第一,kernel函数不能够是静态的,第二,kernel函数不能够写在class之中。 具体处理方法应该是写一个class来包装kernel所需调用的函数,然后通过全局函数...

maze的专栏 1881

Python量化交易实战:pytdx库高效获取通达信分笔成交数据

本文详细介绍了如何使用Python的pytdx库高效获取通达信分笔成交数据,为量化交易提供关键市场微观结构分析。通过环境搭建、服务器连接、数据获取与清洗的完整流程,帮助开发者快速掌握这一免费高质量数据源,并实现分笔数据的实战分析与应用。

weixin_29061509的博客 1348

CUDA与C++

1.使用thrust: http://stackoverflow.com/questions/13185221/cuda-host-object-to-device http://blog.youkuaiyun.com/shenlan282/article/details/8237576 http://blog.youkuaiyun.com/shenlan282/article/details/8237586

shenlan282的笔记 2370

【nerfStudio】1-在windows上安装nerfStudio

安装Git。安装Visual Studio 2022。在安装CUDA之前必须完成此步骤。必须在“桌面开发与C++”工作流程(在BuildTools版本中称为“C++构建工具”)中包含所需的组件。Nerfstudio要求。我们建议使用conda来管理依赖关系。在继续之前,请确保安装了Conda。 依赖关系 PyTorch 请注意,如果安装了低于2.0.1的PyTorch版本,则应卸载先前版本的pytorch、functorch和tiny-cuda-nn。 基于CUDA 11.8的Torch 2.0.1 安装基

dlhlSC的博客 1692

最新Python爬虫实战(入门爬虫篇)——案例20:某股票数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某股票行情网的静态HTML页面,实现了全市场股票数据的全自动化爬取,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。我们不需要像动态页面那样找隐藏的API接口,只需要确认数据在主文档的HTML源码中,然后通过元素选择器,精准找到每个字段对应的标签,总结出统一的标签结构规律,就能实现批量数据提取。

努力让自己发光,对的人才能迎着光而来 19万+

openssl BIO

struct bio_method_st { int type; char *name; int (*bwrite) (BIO *, const char *, size_t, size_t *); int (*bwrite_old) (BIO *, const char *, int); int (*bread) (BIO *, char *, size_t, size_t *); int (*bread_old) (BIO *, char *, int);

jingshaoyou的博客 446

【人工智能之深度学习】12. BERT微调实战:医疗文本分类的领域自适应技巧与工业级实现

摘要:医疗文本分类是自然语言处理在医疗健康领域的核心应用,可辅助疾病诊断、病历结构化和医疗质量监控。然而,医疗文本的专业术语密集、实体关系复杂及数据长尾分布等特性,导致通用BERT模型性能受限。本文系统阐述医疗文本分类的领域自适应技术,从理论原理到工业级实现展开全流程讲解。首先分析医疗文本的独特属性及技术挑战;随后详解领域继续预训练、适配器微调、对抗训练等核心技术的数学原理;构建包含数据预处理、模型优化、隐私保护的完整实战架构;通过疾病分类、情感分析、事件检测三大案例验证技术有效性。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1005

c++和cuda混合编程记录(一)

最近在用cuda将RT并行化。 很多人都说,最好使用c来写cuda,不要用类,尽量用struct代替。因为在cuda里面使用oo来套现在会有很多问题。我也试过,确实很多问题,之前用cpp写的光线追踪用cuda并行化过程中遇到很多问题!快要崩溃的边缘!之后把类改成了struct之后(估计我还改了其他东西-_-),居然奇迹的好了。

Less Is More 7037

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

cuda 类模板以及全局内存的使用例子

#include "cuda_runtime.h"#include "device_launch_parameters.h"#include #include#define MAX_VALUES 1024templateclass myValues{T values[MAX_VALUES];public:__device__ myValues(T clear){}__device__ void s

tiger1334的专栏 962

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

在多个cuda源文件(*.cu)里共用一个texture

在编写cuda程序中,用到了纹理texture。为了更好地组织代码结构,我想在一个cuda源文件(a.cu)中初始化texture,在另一个cuda源文件(b.cu)的核函数中使用texture。 最初的尝试是在头文件中使用extern声明纹理mTableTex2D。另外两个cuda源文件引用这个头文件,从而实现在两个cuda源文件中都能使用mTableTex2D的目的。 extern te...

sunnyzls的专栏 492

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CUDA C学习之纹理内存的使用

图片的加权叠加:有无使用纹理内存的GPU下运行和CPU下运行的性能比较。 参考了: https://blog.youkuaiyun.com/langzai310/article/details/83573278 https://blog.youkuaiyun.com/shuzfan/article/details/77095270 https://learnopengl-cn.readthedocs.io/zh/...

qq_40801709的博客 659

CUDA纹理对象简介

大家知道,CUDA纹理只能定义为静态全局变量,而不能作为参数传到Kernel中 C/C++ code? 1 2 3 4 5 6 7 texturefloat, 2, cudaReadModeElementType> cuda_tex;   __global__ void Kernel(...) {     float texel = 

slamer的专栏 2995

C与CUDA混合编程配置

原文: http://blog.youkuaiyun.com/u012234115/article/details/34860273 在做项目集成的时候需要用到cpp和cuda文件联调,自己摸索了两种方式实现cpp和cu文件混合编译。本文环境: windows7 64位VS2010CUDA5.5英伟达显卡Tesla C1060前言 装好CUDA 5.5 sdk后,默认会自动添加好系统环境变量。因此不需要额外配置

余弦的专栏 1790

C++与CUDA混合编程

  最近在移植一个结构光三维重建的项目,中间呢,就用到了C++和CUDA的混合编程,中间也遇上了一些问题,就稍微总结整理了一下。   关于如何进行CUDA环境的搭建,网上有很多教程,这里也就不在多说了。   首先我们新建一个的工程,然后运行一下,得到如下的一个效果。   然后我们通过点击解决方案中的「头文件」和「源文件」添加新建项,分别添加.cuh和.cu,这两个文件就相当于是C++中的.h和....

jianquanLee's Blog 1万+
上一篇: 帮导师招收 Master 或者Phd,或者RA
下一篇: OpenCL & CUDA
OpenHero
博客等级 码龄23年 2276粉丝 226原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值