Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting CUDA:在排序功能中使用比较器时,推力如何管理内存?_Sorting_Cuda_Thrust_Gpu - Fatal编程技术网

Sorting CUDA:在排序功能中使用比较器时,推力如何管理内存?

Sorting CUDA:在排序功能中使用比较器时,推力如何管理内存?,sorting,cuda,thrust,gpu,Sorting,Cuda,Thrust,Gpu,我有一个10个字符的char数组,我想把它作为一个参数传递给一个比较器,它将被推力的排序函数使用 为了给这个数组分配内存,我使用cudamaloc。但是cudamaloc在全局内存中分配内存,因此每当线程想要从该数组读取数据时,它都必须访问全局内存 但是这个数组很小,我相信如果将它存储到一些共享内存中,甚至存储在每个线程的寄存器中,效率会更高。然而,是否有可能通过推力实现这一点?如果有,如何实现 以下是比较标准: struct comp{ int *data_to_sort; cha

我有一个10个字符的
char数组
,我想把它作为一个参数传递给一个比较器,它将被推力的排序函数使用

为了给这个数组分配内存,我使用
cudamaloc
。但是
cudamaloc
在全局内存中分配内存,因此每当线程想要从该数组读取数据时,它都必须访问全局内存

但是这个数组很小,我相信如果将它存储到一些共享内存中,甚至存储在每个线程的寄存器中,效率会更高。然而,是否有可能通过推力实现这一点?如果有,如何实现

以下是比较标准:

struct comp{
   int *data_to_sort;
   char *helpingArray;

   comp(int *data_ptr) this->data_to_sort = data_ptr;

   __host__ __device__
      bool operator()(const int&a, const int&b){

            //use helpingArray to do some comparisons and
           // return true/false accordingly

      }
 }
然后我在全局内存中为
helpingArray
分配内存,并将其作为带有
比较器的参数传递给排序函数

请注意,
data\u to\u sort
数组存储在全局内存中,因为它包含需要排序的数据,我们无法避免发生这种情况


这很好,排序方法比cpu排序方法快,但是,我相信如果我避免将
helpingArray
存储在全局内存中,排序方法将变得更快。

我同意将
helpingArray
放入全局内存没有什么意义,并且至少在某种程度上降低了性能。执行内核的推力后端是“封闭的”,不公开内核级的特性,如共享内存或寄存器,因此不能直接使用

话虽如此,您可能可以做两件事来改善这一点。第一个是像这样声明你的函子:

struct comp{
   char helpingArray[10];

   __host__ __device__
      bool operator()(const int&a, const int&b){ ... }
 }
在将函子传递给正在使用的推力算法之前,可以在宿主代码中填充
helpingArray
(请注意,函子是按值传递的,因此这是完全合法的)。在这种情况下,
helpingArray
可能会在线程本地内存中结束。这样做可能会提高性能,也可能不会。当然,它极大地简化了支持事物所需的主机代码


另一种方法是在_常量_内存中声明
helpingArray
,并在函子中引用它。如果每个线程的访问模式是统一的,那么由于恒定缓存,这样做可能会提高性能

顺便问一下,这个字符数组是只读内存。
helpingArray
的访问模式是什么?它是随机的,还是每个线程都会以统一的方式访问它?每个线程最多只能访问
helpingArray
的所有元素。这取决于数据数组的值,但是假设每个线程逐个访问所有元素。我读过关于纹理内存的书,因为我的数据是只读的,也许我可以从中受益?我相信在这种情况下使用共享内存会更好,但是,我不知道如何告诉推力将这些数据发送到每个块的共享内存。我想您可能可以使用
\uuuuu constant\uuuu
内存,它可以利用常量缓存。我认为这就是@Talonmes询问访问模式的原因。我不知道如何告诉你把一些东西放在共享的记忆中。推力并不是真正管理你的函子,而是把它当作一个黑匣子。Stuch唯一真正了解的是comparator函数入口点。感谢您的建议,出于某种原因使用第一种方法会使代码变慢。我创建了一个
comp c(…)
变量,填充helpingArray,并将
c
变量作为输入输入,以供推力排序,但它没有帮助。另一方面,使用常量内存会有一点改进。我的GPU具有2_1兼容性,我听说2_1缓存甚至用于全局内存,这可能就是我没有看到任何显著改进的原因。非常感谢你的帮助!