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