CUDA Thrust 和 sort_by_key

2024-04-22

我正在寻找 CUDA 上的排序算法,它可以对元素数组 A(双精度)进行排序,并返回该数组 A 的键 B 数组。 我知道sort_by_keyThrust 库中的函数,但我希望元素数组 A 保持不变。 我能做些什么?

我的代码是:

void sortCUDA(double V[], int P[], int N) {

        real_t *Vcpy = (double*) malloc(N*sizeof(double));
        memcpy(Vcpy,V,N*sizeof(double));

        thrust::sort_by_key(V, V + N, P);
        free(Vcpy);
}

我正在将推力算法与顺序 cpu 上的其他算法进行比较

N               mergesort       sortCUDA
113             0.000008        0.000010
226             0.000018        0.000016
452             0.000036        0.000020
905             0.000061        0.000034
1810            0.000135        0.000071
3621            0.000297        0.000156
7242            0.000917        0.000338
14484           0.001421        0.000853
28968           0.003069        0.001931
57937           0.006666        0.003939
115874          0.014435        0.008025
231749          0.031059        0.016718
463499          0.067407        0.039848
926999          0.148170        0.118003
1853998         0.329005        0.260837
3707996         0.731768        0.544357
7415992         1.638445        1.073755
14831984        3.668039        2.150179
115035495       39.276560       19.812200
230070990       87.750377       39.762915
460141980       200.940501      74.605219

推力性能还不错,但我想如果我使用 OMP 可能可以轻松获得更好的 CPU 时间

我认为这是因为 memcpy

解决方案:

void thrustSort(double V[], int P[], int N)
{
        thrust::device_vector<int> d_P(N);
        thrust::device_vector<double> d_V(V, V + N);
        thrust::sequence(d_P.begin(), d_P.end());

        thrust::sort_by_key(d_V.begin(), d_V.end(), d_P.begin());

        thrust::copy(d_P.begin(),d_P.end(),P);
}

其中 V 是我要排序的双值


您可以修改比较运算符来对键而不是值进行排序。 @Robert Crovella 正确地指出,无法从主机分配原始设备指针。修改后的算法如下:

struct cmp : public binary_function<int,int,bool>
{
  cmp(const double *ptr) : rawA(ptr) { }

  __host__ __device__ bool operator()(const int i, const int j) const 
  {return rawA[i] > rawA[j];}

   const double *rawA; // an array in global mem
}; 

void sortkeys(double *A, int n) {
  // move data to the gpu
  thrust::device_vector<double> devA(A, A + n);
  double *rawA = thrust::raw_pointer_cast(devA.data());

  thrust::device_vector<int> B(n);
  // initialize keys
  thrust::sequence(B.begin(), B.end());
  thrust::sort(B.begin(), B.end(), cmp(rawA));
  // B now contains the sorted keys
 }

这是 arrayfire 的替代方案。虽然我不确定哪一个更有效,因为 arrayfire 解决方案使用了两个额外的数组:

void sortkeys(double *A, int n) {
   af::array devA(n, A, af::afHost);
   af::array vals, indices;
   // sort and populate vals/indices arrays
   af::sort(vals, indices, devA);
   std::cout << devA << "\n" << indices << "\n";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA Thrust 和 sort_by_key 的相关文章

  • 计数排序的两种方法

    这是我的计数排序的两个实现 在这个非常简单的实现中 我所做的就是计算元素出现的次数 并在输出数组中插入与出现次数相同的次数 实施1 public class Simple static int a 5 6 6 4 4 4 8 8 8 9 4
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • CUDA:获取数组中的最大值及其索引

    我有几个块 每个块在整数数组的单独部分上执行 举个例子 块一从 array 0 到 array 9 块二从 array 10 到 array 20 我可以获得每个块的数组最大值的索引的最佳方法是什么 示例块一 a 0 到 a 10 具有以下
  • 如何对 HTML 表格进行排序?

    我根本不是 HTML 专家 我对微控制器进行编程并开始切线 我创建了一个 html 文档来显示微控制器寄存器 寄存器地址和寄存器描述的表 我创建了一个包含 3 列和大约 120 行的表 某些寄存器地址是可位寻址的 如果它们的地址以 0 或
  • 有条件减少 CUDA

    我需要总结一下100000值存储在数组中 但带有条件 有没有办法在 CUDA 中做到这一点以快速产生结果 任何人都可以发布一个小代码来做到这一点吗 我认为 要执行条件约简 您可以直接将条件引入为乘法0 假 或1 真 加数 换句话说 假设您希
  • Java 8 流过滤器 - 基于排序的更新

    我正在尝试对过滤器中的字段进行排序 输入文件 样本记录 DocumentList Document id 5975ff00a213745b5e1a8ed9 u id mailboxcontent id 5975ff00a213745b5e1
  • Python Pandas 按列对多索引进行排序,但保留树结构

    使用 pandas 0 20 3 我尝试按列 D 对数据帧的 n 个多级进行排序 其中的值 降序 以便维护组的层次结构 输入示例 D A B C Gran1 Par1 Child1 3 Child2 7 Child3 2 Par2 Chil
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • Outlook 中用于删除重复电子邮件的宏 -

    Public Sub RemDups Dim t As Items i As Integer arr As Collection f As Folder parent As Folder target As Folder miLast As
  • Python 中列表的线性合并

    我正在努力通过Google 的 Python 课堂练习 http code google com edu languages google python class index html 其中一个练习是这样的 给定两个按升序排序的列表 创建
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 有没有办法在 C 中按多个变量对结构进行排序?

    我必须编写一个对数组中的结构进行排序的函数 结构是 define MAX USERNAME LENGTH 16 typedef struct char username MAX USERNAME LENGTH unsigned int ri
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • Javascript 无法正确排序 DECIMAL 数字

    我有一些代码可以按字母顺序对名称进行排序 我遇到的问题是它处理小数的方式 它对名称进行排序 如下所示 我宁愿它按数字递增 DOG 1 0510 DOG 1 1031 DOG 11 1792 DOG 12 0920 DOG 12 1170 D
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • CUDA计算能力2.0。全局内存访问模式

    CUDA 计算能力 2 0 Fermi 全局内存访问通过 768 KB L2 缓存进行 看起来 开发人员不再关心全局内存库 但全局内存仍然非常慢 因此正确的访问模式很重要 现在的重点是尽可能多地使用 重用 L2 我的问题是 如何 我将感谢一
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator

随机推荐

  • 返回参数的类型名查找

    最近有一个学生问我一个编译问题 答案很简单 但现在我正在努力寻找原因 一个简单的例子 include
  • 获取 Jenkins 多分支管道中的分支列表

    Jenkins 多分支管道项目的 Blue Ocean 界面显示了自动创建的多个分支 是否有一种编程方式可以从要添加到 Jenkinsfile 的代码中列出管道中的分支 此问题询问位于 Jenkins 应用程序对象模型内的 Jenkins
  • 模板化成员函数的地址[重复]

    这个问题在这里已经有答案了 在下面的例子中 如何找到成员函数f的地址 template
  • 时间戳格式 - 从 1/1000 秒到 1/100 秒

    需要将1 1000秒分辨率的时间戳转换为1 100分辨率 我可能会用to char timestamp text 用于此目的的格式化功能 但是需要帮助text在这里使用 输入表 注意 这里的时间戳存储为 varchar ms1000 val
  • 复杂对象上的自定义 NSSortDescriptor

    这是我的第一篇文章 如果我可能不尊重所有惯例 我很抱歉 尽管我会尽力而为 我以前总是在 SO 上找到解决我的问题的方法 但我完全陷入了一个相当复杂的可可问题 我正在尝试对 CoreData 对象列表进行复杂的排序 我有一个由 Book 对象
  • Jquery:停止传播?

    我已经添加了 stopPropagation 但是 我仍然连续出现两个弹出窗口 这比以前好多了 其中一个被单击的元素有 20 个弹出窗口 是否有更好的方法或者我错过了什么 top document ready function click
  • 如何在 Android 浏览器上阻止某些网址?

    如何在 Android 默认浏览器上阻止某些网址 网站 我想限制用户访问某些列入黑名单的网址 例如 如果我想阻止 Facebook 那么手机内置应用程序浏览器将无法访问此 Facebook 网站 您想通过让用户安装应用程序来阻止用户设备上的
  • 使用 shutdown 终止 Amazon EC2 实例

    我可以使用 API 命令终止 Amazon EC2 实例ec2 终止实例但我试图找出如何在登录到 EC2 实例本身时执行此操作 我试过了立即关闭 h但这只是 停止 实例 而没有完全终止它 有什么办法可以做到这一点吗 您可以在创建实例时设置一
  • tkinter 无法正确识别屏幕分辨率

    我使用的是 4k 显示器 3840x2160 from tkinter import root Tk width root winfo screenwidth height root winfo screenheight print wid
  • MVC DropDownList SelectedValue 未正确显示

    我尝试搜索 但没有找到任何可以解决我的问题的内容 我在 Razor 视图上有一个 DropDownList 它不会显示我在 SelectList 中标记为 选定 的项目 以下是填充列表的控制器代码 var statuses new Sele
  • 密码强度计

    我正在尝试创建自己的 JS 密码强度计 它之前可以工作 但我不喜欢它的工作方式 所以我尝试使用 score 10 而不仅仅是 score 这是我的代码 http jsfiddle net RSq4L http jsfiddle net RS
  • 为什么 Kotlin 编译器需要 var 属性的显式初始化器?

    我无法理解以下 Kotlin 文档 The initializer getter and setter are optional Property type is optional if it can be inferred from th
  • 无法读取未定义的属性“forEach”

    var funcs 1 2 forEach i gt funcs push gt i 为什么会产生下面的错误 TypeError Cannot read property forEach of undefined at Object
  • 如何为 JVectorMap jquery 插件生成新的自定义地图?

    有用的链接 JVectorMap http jvectormap com http jvectormap com 购物中心示例 http jvectormap com examples mall http jvectormap com ex
  • Scala 中 def 和 val 的区别

    循环定义如下 def loop Boolean loop 当x定义为 def x loop然后控制台中会显示 x Boolean and 当x定义为 val x loop然后就进入无限循环 我知道 def 正在使用按名称调用 而 val 正
  • 不允许主机连接到此 MySQL 服务器以进行客户端-服务器应用程序

    我刚刚将表从一台 Web 主机导出到另一台 AWS 以为一切都会顺利 是的 没错 好吧 一切可能出错的事情都已经出错了 尝试查询我的数据库时出现此错误 我之前没有得到过 SQLSTATE HY000 1130 Host
  • Android:如何使用单个按钮执行多个任务

    我有 1 个按钮处于活动状态 我想使用这个 1 按钮来执行多项任务 那么我该怎么办呢 如果我第一次按此按钮 则更改 2 次按钮 如果我按第二次 它就会更新我的数据 但这只是第一次工作第二次就不起作用了 查看我的代码我尝试了什么 Intent
  • 更好的数据库设计是:更多的表还是更多的列?

    一位前同事坚持认为 具有更多表且每个列较少的数据库比具有较少表且每个列较多的数据库更好 例如 您将拥有一个名称表 一个地址表 一个城市表等 而不是包含名称 地址 城市 州 邮政编码等列的客户表 他认为这种设计更加高效和灵活 也许它更灵活 但
  • Caffe 中的预测 - 异常:输入 blob 参数与网络输入不匹配

    我使用 Caffe 使用非常简单的 CNN 结构对非图像数据进行分类 我在尺寸为 n x 1 x 156 x 12 的 HDF5 数据上训练网络没有任何问题 但是 我在对新数据进行分类时遇到了困难 如何在不进行任何预处理的情况下进行简单的前
  • CUDA Thrust 和 sort_by_key

    我正在寻找 CUDA 上的排序算法 它可以对元素数组 A 双精度 进行排序 并返回该数组 A 的键 B 数组 我知道sort by keyThrust 库中的函数 但我希望元素数组 A 保持不变 我能做些什么 我的代码是 void sort