2016-05-20 9 views
0

OpenCV 2.4.9およびCUDA 7.5を使用しているVS 2013プロジェクトがあります。私が発見したのは、コードにthrust(特に、thrust::reduce())というコードがいくつか含まれていれば、OpenCV GPUコードはthrustの呼び出しが実行されても動作を停止するということです。特に、cv::gpu::GpuMat()は、cudaMallocPitchのコールで、アクセス違反であるNULLに失敗します。すべての人に最新のOpenCVバージョンへのアップグレードを促す前に、何か不足しているかどうかを知りたい。 (どのたり、とにかく助けていない可能性があります。)コード内にthrust :: reduce()コールが残っていると、cv :: gpu :: GpuMatコンストラクタが失敗する

これは、エラーを再現するために、多かれ少なかれ、最小限のコードです:

// 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); 
} 
+0

メモリやリソースが不足していませんか?スラストコールでコンパイルすると、アプリケーションに必要なコードとリソースの量が大幅に増えます。 – talonmies

+0

問題はプロジェクトの設定にありました。しかし、ちょうど少数の配列に呼び出されたほんの数人だけで、それが記憶上の問題になることはありますか?そうすれば、図書館は事実上使用できなくなります。とにかくおかげさまで、私はCUDAを学んでいるだけで、GPUリソ​​ースも監視する方法を学ぶ必要があります。 –

+1

ハードウェアアクセラレーションされたディスプレイマネージャを搭載した小型のラップトップGPUでは、CUDAアプリケーションに数百Mbの空き容量があるかもしれません。ランタイムは、アプリケーションがGPU上で何かを実行する前に、ランタイムサポートが必要とするすべてのメモリ(スタック、スレッドローカルメモリなど)を事前に割り当てる必要があります。どのくらいのコードがあなたのアプリにコンパイルされているかによって異なります。いくつかのケースでどのくらいのメモリを残すことができるかに驚かれるでしょう – talonmies

答えて

0

うわー、私はプロジェクトの設定を検討することを決めた、とデフォルトのCUDAコード生成でcompute_20,sm_20に設定されています。私はcompute_50,sm_50に変更しようとしました.GTX 750 Tiを使用しており、OpenCVもCUDA_ARCH_BINを5.0に設定してコンパイルされています。

関連する問題