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);