推力 - 如何使用我的数组/数据 - 模型(Thrust - How to use my array

2019-11-01 08:37发布

我是新来的推力(CUDA),我想要做一些数组操作,但我不觉得在互联网上的任何类似的例子。

我有以下两个阵列(2D):

a = { {1, 2, 3}, {4} }
b = { {5}, {6, 7} }

我想那推力计算此阵:

c = { {1, 2, 3, 5}, {1, 2, 3, 6, 7}, {1, 2, 3, 5}, {1, 2, 3, 6, 7} }

我知道它是如何工作在C / C ++而不是怎么说的推力做到这一点。

这是我知道这是怎么沃尔也许可以工作:

线程1:取[0] - >用b展开。 它写入到c。

线程2:取一[1] - >用b展开。 它写入到c。

但我不知道该怎么做。 我可以写数组a和b的一维数组,如:

thrust::device_vector<int> dev_a;
dev_a.push_back(3); // size of first array
dev_a.push_back(1);
dev_a.push_back(2);
dev_a.push_back(3);
dev_a.push_back(1); // size of secound array
dev_a.push_back(4);

thrust::device_vector<int> dev_b;
dev_b.push_back(1); // size of first array
dev_b.push_back(5);
dev_b.push_back(2); // size of secound array
dev_b.push_back(6);
dev_b.push_back(7); 

和伪功能:

struct expand
{
  __host__ __device__
  ?? ?? (const array ai, const array *b) {
      for bi in b: // each array in the 2d array
      {
          c.push_back(bi[0] + ai[0]); // write down the array count

          for i in ai: // each element in the ai array
             c.push_back(i);

          for i in bi: // each element in the bi array
             c.push_back(i);
      }
  }
};

任何人任何想法?

Answer 1:

我想你不会得到在这类操作的任何GPU的速度增加,因为它需要大量的OO内存访问 - 一个缓慢运行在GPU上。

但是,如果你想无论如何要实现这一点:

  1. 我想,因为我以前写过的原因,相信不会帮你准备使用的算法。 这意味着你需要编写自己的内核,但是,你可以把内存管理thust。

  2. 它总是更快地创建CPU和内存阵列,在准备好时,整个阵列复制到GPU。 (CPU < - > GPU拷贝是更快的数据的长continiuos件)

  3. 请记住,GPU运行数百个线程并行。 每个线程需要知道读什么和在哪里写。

  4. 全球内存操作很慢(300-400时钟)。 避免线程读取从全局内存全阵列式找出它需要只有最后几个字节。

所以,我可以看到你的程序。

  1. 让你的阵列1D在一个CPU内存是这样的:

    浮ARRAY1 [] = {1,2,3,4}; 浮数组2 [] = {5,6,7}; INT arr1offsets [] = {0,2,3,1}; 子阵列对的第一个元素和长度的位置//诠释arr2offsets [] = {0,1,1,2};

  2. 您的阵列和偏移复制到GPU并分配结果的内存,它的偏移量。 我想,你要算一个关节子数组的最大长度,并为最坏的情况分配内存。

  3. 运行内核。

  4. 收集结果

内核可能是这样的(如果我理解正确你的想法)

__global__ void kernel(float* arr1, int* arr1offset, 
                       float* arr2, int* arr2offset, 
                       float* result, int* resultoffset)
{
  int idx = threadIdx.x+ blockDim.x*blockIdx.x;
  int a1beg = arr1offset[Idx*2];
  int a2beg = arr2offset[Idx*2];
  int a1len = arr1offset[Idx*2+1];
  int a2len = arr2offset[Idx*2+1];
  resultoffset[idx*2] = idx*MAX_SUBARRAY_LEN;
  resultoffset[idx*2+1] = a1len+a2len;

  for (int k = 0; k < a1len; ++k) result[idx*MAX_SUBARRAY_LEN+k] = arr1[a1beg+k];
  for (int k = 0; k < a2len; ++k) result[idx*MAX_SUBARRAY_LEN+a1len+k] = arr2[a2beg+k];
}

此代码是不完美的,但应该做的正确的事情。



文章来源: Thrust - How to use my array/data - model