2016-05-18 3 views
-1

Я пишу программу, используя 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 

по какой-то причине , Я попытался решить это уже пару дней без везения. Почему возникает это исключение?

+3

Пожалуйста, добавьте [mcve] –

+0

Вы включили поддержку Cuda при компиляции? '-DTHRUST_DEVICE_SYSTEM = THRUST_DEVICE_SYSTEM_CUDA' – Dimaleks

+0

@ dimaleks, честно говоря, я понятия не имею, где я должен это делать и что это значит. Чтобы быть ясным, я попробовал сортировку с быстрой сортировкой (без толчка), и все работало. Так что-то о вызове метода или указателях может быть неправильным? – Alexander

ответ

0

Так что я пробовал этот код на другом ПК, и он работал без проблем. Другие люди предположили, что проблема на моем ПК может быть в версии CUDA/Video и любом другом. В любом случае, thats crazy ... Мне жаль, что я не буду пытаться переустановить эти вещи, чтобы проверить, так как я узнал, что пользовательский метод сортировки работает не намного дольше, чем thrust :: sort.

Смежные вопросы