我最近尝试将我的 CUDA 代码与 OpenMP 结合起来,但出现了一些问题。我的 CUDA-OpenMP 代码写成
int main (void)
{
cudaGetDeviceCount(&gpuNum);
//declare variables
float *data_h; *data_d[gpuNum];
data_h = (float*)malloc(Mem);
....
....
omp_set_num_threads(gpuNum);
#pragma omp parallel
{
int cpuid = omp_get_thread_num();
cudaSetDevice(cpuid);
cudaMalloc((void**)&data_d[cpuid], Mem );
cudaMemcpy( data_d[cpuid], data_h, Mem, cudaMemcpyHostToDevice);
kernel<<< gpu_block, gpu_thread >>>();
cudaMemcpy( data_h, data_d[cpuid], Mem, cudaMemcpyDeviceToHost);
}
printf("end of parallel\n");
//post process
}
问题是有时当我运行这段代码时,一切都很顺利,但有时它会停止并且不会打印出“并行结束”语句。这种情况是随机发生的,谁能告诉我这可能是什么原因?