使用CUDA的矩阵行中每个元素的等级

时间:2017-02-01 06:21:44

标签: cuda pycuda

有没有办法使用CUDA或NVidia提供的任何函数分别找到矩阵行中元素的等级?

2 个答案:

答案 0 :(得分:1)

我不知道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,
$

答案 1 :(得分:-1)

如果您使用的是CUDA,则概念排名与其他语言(如openmp或mpi)不同。在这种情况下,您将需要使用threadIdx.x和blockIdx.x参数的代码的 global

相关问题