C++ 使用推力对静态分配数组进行排序

C++ 使用推力对静态分配数组进行排序,c++,sorting,cuda,thrust,C++,Sorting,Cuda,Thrust,在我的代码中,我在全局内存中有一个静态分配的数组(即,使用\uuuu device\uuu分配),我想使用推力::排序进行排序,但它不起作用。本主题的所有示例都使用CUDA运行时分配的数组(使用cudamaloc)。是否有任何方法可以对静态分配的数组进行排序 我想这与主机无法访问静态分配的内存有关。使用cudamaloc分配的数组,它工作正常。但是,我希望避免使用这种类型的分配,因为静态分配允许更容易地从设备代码访问数据(不是吗?) 最小(非)工作示例: #包括 #包括 #包括 #定义n4 类型

在我的代码中,我在全局内存中有一个静态分配的数组(即,使用
\uuuu device\uuu
分配),我想使用
推力::排序
进行排序,但它不起作用。本主题的所有示例都使用CUDA运行时分配的数组(使用
cudamaloc
)。是否有任何方法可以对静态分配的数组进行排序

我想这与主机无法访问静态分配的内存有关。使用
cudamaloc
分配的数组,它工作正常。但是,我希望避免使用这种类型的分配,因为静态分配允许更容易地从设备代码访问数据(不是吗?)

最小(非)工作示例:
#包括
#包括
#包括
#定义n4
类型定义结构元素{
int键;
int值;
__主机\设备\布尔运算符e.key;}
}元素;
__设备元素数组[N];
__全局无效初始化(){
对于(int i=0;i
使用
cudaGetSymbolAddress
\uuuuu主机
函数获取
数组
变量的地址:

void* array_ptr = 0;
cudaGetSymbolAddress(&array_ptr, array);
thrust::device_ptr<element> array_first(reinterpret_cast<element*>(array_ptr));

排序后的输出与未排序的输出相同,但我想这是有意的,因为数据的生成方式和
元素::运算符的定义使用
cudaGetSymbolAddress
\uuuuuuu主机\uuuuu
函数获取
数组
变量的地址:

void* array_ptr = 0;
cudaGetSymbolAddress(&array_ptr, array);
thrust::device_ptr<element> array_first(reinterpret_cast<element*>(array_ptr));
排序后的输出与未排序的输出相同,但我想这是有意的,因为数据的生成方式和
element::operator的定义如下:

i、 e.您需要在运行时使用从GPU上下文读取地址,然后您可以在GPU代码中使用该调用的结果。

此:

__device__ element array[N];

...

thrust::device_ptr<element> array_first(array);

i、 e.您需要在运行时使用从GPU上下文中读取地址,然后您可以在GPU代码中使用该调用的结果。

我不确定以这种方式从
\uuuuuu主机\uuuuuu
函数中获取
\uuuuu设备\uuuuuuuu
变量的地址是否合法。@JaredHoberock:这肯定是不合法的。需要调用
cudaGetSymbolAddress
。我不确定从
\uuuu主机\uuuu
函数中以这种方式获取
\uuuu设备\uuuuuu
变量的地址是否合法。@JaredHoberock:这肯定是不合法的。需要调用
cudaGetSymbolAddress
$ nvcc test.cu -run
unsorted: 3 2 1 0 
sorted: 3 2 1 0 
__device__ element array[N];

...

thrust::device_ptr<element> array_first(array);
element* array_d;
cudaGetSymbolAddress((void **)&array_d, array);
thrust::device_ptr<element> array_first(array_d);