使用CUDA计算矩阵行中每个元素的秩

使用CUDA计算矩阵行中每个元素的秩,cuda,pycuda,Cuda,Pycuda,有没有办法使用CUDA或NVidia提供的任何函数单独查找矩阵行中元素的排名?我不知道CUDA或我熟悉的任何库中有内置的排名或argsort函数 例如,您当然可以使用推力从较低级别的操作中构建这样的函数 以下是使用推力的可能解决方案的(非优化)概要: $ cat t84.cu #include <thrust/device_vector.h> #include <thrust/copy.h> #include <thrust/sort.h> #include

有没有办法使用CUDA或NVidia提供的任何函数单独查找矩阵行中元素的排名?

我不知道CUDA或我熟悉的任何库中有内置的排名或argsort函数

例如,您当然可以使用推力从较低级别的操作中构建这样的函数

以下是使用推力的可能解决方案的(非优化)概要:

$ cat t84.cu
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/sort.h>
#include <thrust/sequence.h>
#include <thrust/functional.h>
#include <thrust/adjacent_difference.h>
#include <thrust/transform.h>
#include <thrust/iterator/permutation_iterator.h>
#include <iostream>

typedef int mytype;

struct clamp
{
  template <typename T>
  __host__ __device__
  T operator()(T data){
    if (data == 0) return 0;
    return 1;}
};

int main(){

  mytype data[]  = {4,1,7,1};
  int dsize = sizeof(data)/sizeof(data[0]);
  thrust::device_vector<mytype> d_data(data, data+dsize);
  thrust::device_vector<int> d_idx(dsize);
  thrust::device_vector<int> d_result(dsize);

  thrust::sequence(d_idx.begin(), d_idx.end());

  thrust::sort_by_key(d_data.begin(), d_data.end(), d_idx.begin(), thrust::less<mytype>());
  thrust::device_vector<int> d_diff(dsize);
  thrust::adjacent_difference(d_data.begin(), d_data.end(), d_diff.begin());
  d_diff[0] = 0;
  thrust::transform(d_diff.begin(), d_diff.end(), d_diff.begin(), clamp());
  thrust::inclusive_scan(d_diff.begin(), d_diff.end(), d_diff.begin());

  thrust::copy(d_diff.begin(), d_diff.end(), thrust::make_permutation_iterator(d_result.begin(), d_idx.begin()));
  thrust::copy(d_result.begin(), d_result.end(), std::ostream_iterator<int>(std::cout, ","));
  std::cout << std::endl;
}

$ nvcc -arch=sm_61 -o t84 t84.cu
$ ./t84
1,0,2,0,
$
$cat t84.cu
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
typedef int-mytype;
结构钳
{
模板
__主机设备__
T运算符()(T数据){
如果(数据==0)返回0;
返回1;}
};
int main(){
mytype数据[]={4,1,7,1};
int dsize=sizeof(数据)/sizeof(数据[0]);
推力:设备矢量数据(数据,数据+数据大小);
推力:设备向量d_idx(dsize);
推力:设备矢量d结果(dsize);
序列(d_idx.begin(),d_idx.end());
推力::按_键排序(d_data.begin(),d_data.end(),d_idx.begin(),推力::less());
推力:设备矢量差(dsize);
推力:相邻_差(d_data.begin(),d_data.end(),d_diff.begin());
d_diff[0]=0;
推力::变换(d_diff.begin(),d_diff.end(),d_diff.begin(),clamp());
推力:包容性扫描(d_diff.begin()、d_diff.end()、d_diff.begin());
推力::复制(d_diff.begin(),d_diff.end(),推力::生成置换迭代器(d_result.begin(),d_idx.begin());
推力::复制(d_result.begin()、d_result.end()、std::ostream_迭代器(std::cout,“,”);

std::cout如果您在CUDA,概念等级与openmp或mpi等其他语言上的概念等级不同。在这种情况下,您需要进行全局代码块,您需要使用threadIdx.x和blockIdx.x参数您能更详细地描述您的问题吗?问题的详细信息:例如:行元素=[4,1,7,1],秩=[1,0,2,0]相同的秩将被分配给相等的值。谢谢。为什么它是非优化的?如果我没有错的话,你的解决方案是基于向量的。因为我想在矩阵行中执行上述任务,你的解决方案在这种情况下有效吗?我可以在pyCUDA中使用它吗?它是非优化的,因为我没有考虑创建这样一个函数的所有不同方法ion,所以我想有更多的优化方法。即使有了所示,也可能会巧妙地使用推力融合来提高性能。概述的方法是试图以概念草图的形式展示如何实现行排序功能。如果您想将其扩展到同时处理矩阵行,我想这是可以做到的,就像rust操作可以通过这种方式扩展(看看推力示例)。关于pyCUDA,如果你在谷歌上搜索“推力pyCUDA”,你会发现互操作示例。