东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1645|回复: 1
打印 上一主题 下一主题

[C/C++] thrust::reduce或其他函数操作的数据来源方式device_ptr封装

[复制链接]

1366

主题

1857

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14459
QQ
跳转到指定楼层
楼主
发表于 2021-6-17 10:42:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式




//thrust::reduce或其他函数操作的数据来源:device_ptr封装
//1、thrust::device_vector<type>直接定义的
//2、cudaMalloc与cudaMemcpy来的需要用thrust::device_ptr封装一下


//thrust中还定义了device_ptr指针类型,当传入函数的指针是指向device端的内存时,需要用device_ptr进行封装





  1. #include <thrust/device_vector.h>
  2. #include <iostream>

  3. using namespace std;
  4. //thrust::reduce或其他函数操作的数据来源:
  5. //1、thrust::device_vector<type>直接定义的
  6. //2、cudaMalloc与cudaMemcpy来的需要用thrust::device_ptr封装一下

  7. //thrust中还定义了device_ptr指针类型,当传入函数的指针是指向device端的内存时,需要用device_ptr进行封装


  8. int main(void){
  9.     float array[6] = { 3, 1, 2, 3, 5, 4 };
  10.     float *dev_array = 0;
  11.     cudaMalloc(&dev_array, sizeof(float) * 6);
  12.     cudaMemcpy(dev_array, array, sizeof(float) * 6, cudaMemcpyHostToDevice);

  13.     //dev_array :指向GPU设备内存块的指针  需要用device_ptr进行封装  否则:段错误 (核心已转储)
  14.     thrust::device_ptr<float> dev_ptr(dev_array); // 这里是赋值吧? dev_ptr= dev_array 并封装
  15.    
  16.     cout << "看地址的值:" << dev_array << endl;
  17.     cout << "device_ptr看地址的值:" << dev_ptr << endl;
  18.     //从device_ptr中提取“原始”指针需要使用raw_pointer_cast函数
  19.     float *raw_pointer_dev_array=thrust::raw_pointer_cast(dev_ptr);
  20.     cout << "raw_device_ptr看地址的值:" << raw_pointer_dev_array << endl;

  21.     //由于dev_array指向device端,不能直接作为参数,需要对其封装 否则:段错误 (核心已转储)
  22.     int sum = thrust::reduce(dev_ptr, dev_ptr + 6, (int) 0, thrust::plus<int>());
  23.     cout << "求和的结果=" << sum << endl;

  24.     thrust::host_vector<float> hvec(6, 2);
  25.     thrust::device_vector<float> dvec;
  26.     dvec=hvec; //device vector和 host vector可以直接用等号进行传递,对应于cudaMemcpy的功能
  27.     //此时的参数是迭代器,不用也不能用device_ptr对其封装
  28.     sum = thrust::reduce(dvec.begin(), dvec.end(), (int) 0, thrust::plus<int>());
  29.     cout << "求和的结果=" << sum << endl;

  30.     //上述的两种函数的调用方法也存在host端的版本,传入的指针或者迭代器都是host端数据
  31.     // thrust::reduce(array, array + 6);
  32.     // thrust::reduce(hvec.begin(), hvec.end());

  33.    

  34.     return 0;
  35. }


复制代码








让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:39:16 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-24 03:28 , Processed in 0.169315 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表