当前位置: 首页 > news >正文

【CUDA】thrust进行前缀和的操作

接上篇文章,可以发现使用CUDA提供的API进行前缀和扫描时,第一次运行的时间不如共享内存访问,猜测是使用到了全局内存。
首先看调用逻辑:

thrust::inclusive_scan(thrust::device, d_x, d_x + N, d_x);

第一个参数指定了设备,根据实参数量和类型找到对应的函数,是scan.h中的如下函数:

template <typename DerivedPolicy, typename InputIterator, typename OutputIterator>
_CCCL_HOST_DEVICE OutputIterator inclusive_scan(const thrust::detail::execution_policy_base<DerivedPolicy>& exec,InputIterator first,InputIterator last,OutputIterator result);

其实现位于thrust\thrust\system\cuda\detail\scan.h
注意:路径可能与实际有偏差,可以在/usr/local/下使用find . -name xx查找对应的文件

template <typename Derived, typename InputIt, typename OutputIt>
_CCCL_HOST_DEVICE OutputIt
inclusive_scan(thrust::cuda_cub::execution_policy<Derived>& policy, InputIt first, InputIt last, OutputIt result)
{return thrust::cuda_cub::inclusive_scan(policy, first, last, result, thrust::plus<>{});
}

将操作指定为plus,
然后执行同一文件下的此函数:

template <typename Derived, typename InputIt, typename OutputIt, typename ScanOp>
_CCCL_HOST_DEVICE OutputIt inclusive_scan(thrust::cuda_cub::execution_policy<Derived>& policy, InputIt first, InputIt last, OutputIt result, ScanOp scan_op)
{using diff_t           = typename thrust::iterator_traits<InputIt>::difference_type;diff_t const num_items = thrust::distance(first, last);return thrust::cuda_cub::inclusive_scan_n(policy, first, num_items, result, scan_op);
}

最终找到主要的执行逻辑:

_CCCL_EXEC_CHECK_DISABLE
template <typename Derived, typename InputIt, typename Size, typename OutputIt, typename ScanOp>
_CCCL_HOST_DEVICE OutputIt inclusive_scan_n_impl(thrust::cuda_cub::execution_policy<Derived>& policy, InputIt first, Size num_items, OutputIt result, ScanOp scan_op)
{using AccumT     = typename thrust::iterator_traits<InputIt>::value_type;using Dispatch32 = cub::DispatchScan<InputIt, OutputIt, ScanOp, cub::NullType, std::int32_t, AccumT>;using Dispatch64 = cub::DispatchScan<InputIt, OutputIt, ScanOp, cub::NullType, std::int64_t, AccumT>;cudaStream_t stream = thrust::cuda_cub::stream(policy);cudaError_t status;// Determine temporary storage requirements:size_t tmp_size = 0;{THRUST_INDEX_TYPE_DISPATCH2(status,Dispatch32::Dispatch,Dispatch64::Dispatch,num_items,(nullptr, tmp_size, first, result, scan_op, cub::NullType{}, num_items_fixed, stream));thrust::cuda_cub::throw_on_error(status,"after determining tmp storage ""requirements for inclusive_scan");}// Run scan:{// Allocate temporary storage:thrust::detail::temporary_array<std::uint8_t, Derived> tmp{policy, tmp_size};THRUST_INDEX_TYPE_DISPATCH2(status,Dispatch32::Dispatch,Dispatch64::Dispatch,num_items,(tmp.data().get(), tmp_size, first, result, scan_op, cub::NullType{}, num_items_fixed, stream));thrust::cuda_cub::throw_on_error(status, "after dispatching inclusive_scan kernel");thrust::cuda_cub::throw_on_error(thrust::cuda_cub::synchronize_optional(policy), "inclusive_scan failed to synchronize");}return result + num_items;
}

可以看到,此处thrust调用了cub的Dispatchscan操作,而cub中是使用全局内存的,因此造成了效率还不如手动编写使用共享内存的算法。

http://www.lryc.cn/news/400949.html

相关文章:

  • Qt-QPainter的使用总结
  • 轻松搞定GIS场景编辑,这款免费工具你一定要试试
  • 【笔记】一起齿轮箱的故障和相应的数学模拟实验
  • 官宣:百数低代码平台已顺利通过国家信息安全等级保护三级认证
  • Spring源码注解篇二:手写@Component注解
  • 云备份服务端
  • Jupyter Notebook 使用教程
  • Leetcode 100361100367.切割蛋糕的最小总开销
  • 单网口设备的IP地址识别-还原-自组网
  • 太速科技-FMC207-基于FMC 两路QSFP+光纤收发子卡
  • 昇思25天学习打卡营第13天|munger85
  • Python - Word转TXT文本,或TXT文本转Word
  • 链接追踪系列-00.es设置日志保存7天-番外篇
  • Vant Ui 最新访问地址
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(八)-通过无人机进行无线接入
  • PTrade量化交易终端常见问题11
  • 被动的机器人非线性MPC控制
  • 什么样的服务器是合乎直销网站标准
  • python 语法学习 day13
  • Spring MVC中Restful风格引入
  • C# Winform 系统方案目录的管理开发
  • 算法-二叉树常见问题详解
  • 【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
  • Go语言指针及不支持语法汇总
  • Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?
  • MATLAB中Simulink.SimulationData.Dataset用法
  • Spring Security学习笔记(一)Spring Security架构原理
  • nginx的access.log日志输出请求数
  • 前端网站(三)-- 记事本【附源码】
  • java——Junit单元测试