我是CUDA开发的新手,我正在尝试使用推力库的排序方法对结构数组进行排序。我的结构是这样的:
#define N 307200
struct distanceVector {
Point3D a, b;
float distance;
};
我想在“距离”上对数组进行排序,但是,sort函数需要两个随机访问迭代器,因为我没有使用向量,所以我没有。我尝试过这样的事情:
bool distance_sort(distanceVector A, distanceVector B){
return (A.distance > B.distance);
}
distanceVector * MyStructArray;
cudaMalloc((void**)&MyStructArray, sizeof(distanceVector) * N);
//LAUNCH KERNEL WHICH FILLS MYSTRUCTARRAY AND THEN...
thrust::sort(MyStructArray, MyStructArray + N, distance_sort);
...我在[推导指南] [1]中看到了一个例子:
#include <thrust/sort.h>
#include <thrust/functional.h>
...
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(A, A + N, thrust::greater<int>());
// A is now {8, 7, 5, 4, 2, 1}
虽然它编译,但在执行期间我得到一个“访问冲突读取位置0x405e041c”。错误。 在调试应用程序时,insert_sort.h文件中的此部分停止:
for(RandomAccessIterator i = first + 1; i != last; ++i)
{
value_type tmp = *i;
if (wrapped_comp(tmp, *first)).......
有没有办法在不使用推力矢量的情况下解决这个问题?
答案 0 :(得分:2)
好的,所以我发现了我的错误。问题是我试图在设备上分配的内存上使用推力。我首先尝试将MyStructArray复制到主机设备,然后使用推力排序,它完美地工作。为了处理设备的内存,我必须使用thrust :: device_ptr&lt; MyStruct&gt;指针(MyStructArray)。 希望这有助于其他人。
答案 1 :(得分:0)
我尝试使用thrust::sort
对thrust::host_vector<struct>
和thrust::device_vector<struct>
进行排序。它们在我的设备上都运行良好。
这是我的代码:
#include <bits/stdc++.h>
#include <stdio.h>
#include <cuda_runtime.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <time.h>
#include <thrust/functional.h>
const int MAXN = 1e2;
typedef struct Node {
int x, y;
__host__ __device__ bool operator < (const Node& a) const {
if (x == a.x) {
return x ? y<a.y : y>a.y;
}else
return x < a.x;
}
}Node;
int main() {
thrust::host_vector<Node> h(MAXN),ne(MAXN);
for (int i = 0; i < MAXN; i++) {
h[i].x = rand() % 2;
h[i].y = rand() % 997;
}
thrust::device_vector<Node> d = h;
thrust::sort(h.begin(), h.end());
thrust::sort(d.begin(), d.end());
ne = d;
for (int i = 0; i < MAXN; i++) {
std::cout << h[i].x << " " << h[i].y << " | " << ne[i].x << " " << ne[i].y << std::endl;
}
}