Я пишу программу, используя cuda. Проблема заключается в следующем: У меня есть два массива в * куб файле:thrust :: sort_by_key system_error в ячейке памяти
particle* particles;
int* grid_ind;
Место на GPU выделяются для них:
void mallocCUDA(int particlesNumber) {
cudaMalloc((void**)&particles, particlesNumber * sizeof(particle));
cudaMalloc((void**)&grid_ind, particlesNumber * sizeof(int));
}
заполнен Оба массива (подтверждено). Частицы в своем собственном методе инициализации и grid_ind:
__global__ void findParticleCell(particle* particles, int particlesNumber, int* grid_ind) {
int index = blockDim.x*blockIdx.x + threadIdx.x;
if (index < particlesNumber) {
int x, y, z;
x = (int)(2.0f * (particles[index].predicted_p.x + 2));
y = (int)(2.0f * (particles[index].predicted_p.y + 2));
z = (int)(2.0f * (particles[index].predicted_p.z + 2));
int grid_index = (BOX_X + 2) * 2 * (BOX_Y + 2) * 2 * z + y * 2 * (BOX_X + 2) + x;
grid_ind[index] = grid_index;
}
}
Это называется следующим способом:
void findNeighbors(int particlesNumber) {
dim3 blocks = dim3((particlesNumber + threadsPerBlock - 1)/threadsPerBlock); // threadsPerBlock = 128 if that matters at all
dim3 threads = dim3(threadsPerBlock);
findParticleCell << <blocks, threads >> > (particles, particlesNumber, grid_ind);
thrust::device_ptr<int> t_grid_ind = thrust::device_pointer_cast(grid_ind);
thrust::device_ptr<particle> t_particles = thrust::device_pointer_cast(particles);
thrust::sort_by_key(t_grid_ind, t_grid_ind + particlesNumber, t_particles);
}
Проблема в том, что метод сортировки вызывает
Microsoft C++ exception: thrust::system::system_error at memory location
по какой-то причине , Я попытался решить это уже пару дней без везения. Почему возникает это исключение?
Пожалуйста, добавьте [mcve] –
Вы включили поддержку Cuda при компиляции? '-DTHRUST_DEVICE_SYSTEM = THRUST_DEVICE_SYSTEM_CUDA' – Dimaleks
@ dimaleks, честно говоря, я понятия не имею, где я должен это делать и что это значит. Чтобы быть ясным, я попробовал сортировку с быстрой сортировкой (без толчка), и все работало. Так что-то о вызове метода или указателях может быть неправильным? – Alexander