如果代码中有一个thrust :: reduce()调用LATER,则cv :: gpu :: GpuMat构造函数失败

时间:2016-05-20 11:18:40

标签: c++ opencv cuda thrust

我有一个VS 2013项目,我使用(有点过时)OpenCV 2.4.9和CUDA 7.5。我发现如果代码包含一些 - 但不是全部 - thrust调用(特别是thrust::reduce()),那么OpenCV GPU代码即使在任何thrust调用之前执行也会停止工作。特别是cv::gpu::GpuMat() cudaMallocPitch内部NULL调用失败,// main.cu #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <opencv2/gpu/gpu.hpp> #include <thrust/device_vector.h> #include <thrust/transform.h> #include <thrust/reduce.h> #include <thrust/functional.h> #include <stdio.h> int main() { const int arraySize = 5; float fc[arraySize] = { 0 }; float* dev_c; cv::Mat m = cv::Mat::eye(100,100,CV_32F); cv::gpu::GpuMat g(m); cudaMalloc((void**)&dev_c, arraySize * sizeof(int)); cudaMemcpy(dev_c, fc, arraySize * sizeof(int), cudaMemcpyHostToDevice); thrust::device_ptr<float> dev_ptr = thrust::device_pointer_cast(dev_c); // the line below works fine thrust::transform(dev_ptr, dev_ptr + arraySize, dev_ptr, dev_ptr, thrust::multiplies<float>()); // the line below causes cv::gpu::GpuMat to crash, but the program works if it is commented float sum2 = thrust::reduce(dev_ptr, dev_ptr + arraySize, 0, thrust::plus<float>()); cudaFree(dev_c); } 位置有访问权限违规。在我敦促每个人升级到最新的OpenCV版本之前,我想知道我是否遗漏了一些东西。 (无论如何,这可能会有所帮助。)

这是一个或多或少的重现错误的代码:

{{1}}

1 个答案:

答案 0 :(得分:0)

哇,我决定研究项目设置,默认情况下,CUDA代码生成设置为compute_20,sm_20。我尝试将其更改为compute_50,sm_50,因为我正在使用GTX 750 Ti和OpenCV也是在CUDA_ARCH_BIN设置为5.0的情况下编译的,现在一切正常。