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);
}
メモリやリソースが不足していませんか?スラストコールでコンパイルすると、アプリケーションに必要なコードとリソースの量が大幅に増えます。 – talonmies
問題はプロジェクトの設定にありました。しかし、ちょうど少数の配列に呼び出されたほんの数人だけで、それが記憶上の問題になることはありますか?そうすれば、図書館は事実上使用できなくなります。とにかくおかげさまで、私はCUDAを学んでいるだけで、GPUリソースも監視する方法を学ぶ必要があります。 –
ハードウェアアクセラレーションされたディスプレイマネージャを搭載した小型のラップトップGPUでは、CUDAアプリケーションに数百Mbの空き容量があるかもしれません。ランタイムは、アプリケーションがGPU上で何かを実行する前に、ランタイムサポートが必要とするすべてのメモリ(スタック、スレッドローカルメモリなど)を事前に割り当てる必要があります。どのくらいのコードがあなたのアプリにコンパイルされているかによって異なります。いくつかのケースでどのくらいのメモリを残すことができるかに驚かれるでしょう – talonmies