-1
私はcudaを使ってプログラムを書いています。 問題は以下の通りです:GPU上thrust :: sort_by_keyメモリ位置のsystem_error
particle* particles;
int* grid_ind;
場所が彼らのために割り当てられている:私は* CUはファイル内の2つのアレイ持っ 両方のアレイが満たされている
void mallocCUDA(int particlesNumber) {
cudaMalloc((void**)&particles, particlesNumber * sizeof(particle));
cudaMalloc((void**)&grid_ind, particlesNumber * sizeof(int));
}
を(確認)。独自のinitメソッドと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