Масштабируются ли функции OpenCV GPU в зависимости от количества ядер в GPU?

Я новичок в CUDA и у меня возникли проблемы с выполнением графической версии оптического потока farneback. Недавно я использовал gpu-версию оптического потока farneback, предоставленного в opencv, для одного из моих приложений распознавания действий в видео. Я выполнил оптический поток farneback (версия для графического процессора) для одного из примеров видео, и для расчета оптического потока на NVidea Geforce Gpu с 96 ядрами потребовалось около 12 секунд.

Однако тот же код, который я пытаюсь запустить на более продвинутом графическом процессоре (TitanX), который имеет около 3072 ядер, но я не знаю, почему для вычисления оптического потока требуется почти столько же времени, сколько для NVidea Geforce. ГПУ. Возможно ли, что мой код имеет некоторые недостатки или возможно, что сама функция выделяет ограниченное количество ядер для выполнения программы независимо от графического процессора? Могу ли я получить доступ к числу потоков, которые функция может выделить для графического процессора, чтобы я мог вручную установить количество потоков, чтобы ускорить код для более продвинутого графического процессора. Файл cuda для оптического потока дальней связи имеет несколько строк кода, таких как блок dim3 (128), которые выделяют некоторый размер блока для графического процессора. Будет ли моя программа работать быстро, если я попытаюсь увеличить размер блока со 128 до 256? Я пробовал, но он показывает какую-то ошибку, такую ​​как Ошибка OpenCV: вызов API Gpu (недопустимая функция устройства) в вызове, файл /home/aditya-vision/opencv-2.4.9/modules/gpu/include/opencv2/gpu/device/ detail / transform_detail.hpp. Пожалуйста, помогите мне через это, давая ваши ценные предложения.

Я также публикую вывод nvprof, с помощью которого я визуализировал загрузочные узлы в коде. Пожалуйста, дайте ваши предложения, основанные на этом.

==10935== NVPROF is profiling process 10935, command: ./farneback_flow resizeVideo.avi 
It took 14 second(s). 
==10935== Profiling application: ./farneback_flow resizeVideo.avi
==10935== Profiling result:
Time(%)      Time     Calls       Avg       Min       Max  Name
62.38%  543.05ms      9870  55.020us  23.265us  263.63us cv::gpu::device::optflow_farneback::boxFilter5(int, int, cv::gpu::PtrStep<float>, int, float, cv::gpu::PtrStep<float>)
17.11%  148.94ms      9870  15.090us  5.9840us  58.978us  cv::gpu::device::optflow_farneback::updateMatrices(int, int, cv::gpu::PtrStep<float>, cv::gpu::PtrStep<float>,cv::gpu::PtrStep<float>, cv::gpu::PtrStep<float>, cv::gpu::PtrStep<float>)
5.12%  44.550ms      1974  22.568us  15.328us  41.090us  void cv::gpu::device::optflow_farneback::gaussianBlur<cv::gpu::device::BrdReflect101<float>>(int, int, cv::gpu::PtrStep<float>, int, float, cv::gpu::PtrStep)
5.07%  44.137ms      9870  4.4710us  2.7200us  16.225us  cv::gpu::device::optflow_farneback::updateFlow(int, int, cv::gpu::PtrStep<float>, cv::gpu::PtrStep<float>, cv::gpu::PtrStep<float>)
3.72%  32.371ms       658  49.196us  48.898us  53.090us  [CUDA memcpy DtoH]
3.05%  26.517ms      1974  13.433us  5.9200us  31.265us  void cv::gpu::device::optflow_farneback::polynomialExpansion<int=5>(int, int, cv::gpu::PtrStep<float>, cv::gpu::PtrStep)
1.58%  13.744ms      4277  3.2130us     928ns  17.601us  [CUDA memcpy HtoD]
0.96%  8.3349ms      2632  3.1660us  2.0800us  5.7610us  void cv::gpu::device::resize_linear<float>(cv::gpu::PtrStepSz<float>, float, float, float)
0.38%  3.3082ms       658  5.0270us  4.4480us  6.4960us  [CUDA memcpy DtoD]
0.36%  3.1376ms      1316  2.3840us  1.4400us  3.5840us  void cv::gpu::device::transform_detail::transformSmart<float, float, cv::gpu::device::Convertor<float, float, float>, cv::gpu::device::WithOutMask>(cv::gpu::PtrStepSz<float>, cv::gpu::PtrStep<float>, float, float)
0.20%  1.7484ms       658  2.6570us  1.8880us  5.4720us  void cv::gpu::device::transform_detail::transformSmart<unsigned char, float, cv::gpu::device::Convertor<unsigned char, float, float>, cv::gpu::device::WithOutMask>(cv::gpu::PtrStepSz<unsigned char>, cv::gpu::PtrStep<float>, float, unsigned char)
0.08%  707.22us       658  1.0740us     864ns  1.8240us  [CUDA memset]

==10935== API calls:
Time(%)      Time     Calls       Avg       Min       Max  Name
92.17%  12.7227s      1342  9.4804ms  4.1420us  12.6725s  cudaMallocPitch
3.96%  547.18ms      1342  407.74us  3.5120us  1.7912ms  cudaFree
1.47%  202.25ms     38164  5.2990us  4.1290us  266.19us  cudaLaunch
0.87%  120.66ms     41783  2.8870us     579ns  268.98us  cudaStreamSynchronize
0.55%  75.686ms      1974  38.341us  6.9130us  113.53us  cudaMemcpy2D
0.28%  38.270ms    215824     177ns     144ns  264.85us  cudaSetupArgument
0.27%  36.972ms      1316  28.093us  9.7560us  44.813us  cudaDeviceSynchronize
0.20%  27.309ms      3619  7.5460us  5.6390us  35.784us  cudaMemcpyToSymbol
0.06%  8.2456ms     38164     216ns     159ns  264.80us  cudaGetLastError
0.06%  7.6159ms     38164     199ns     158ns  229.11us  cudaConfigureCall
0.05%  6.2155ms       658  9.4460us  5.0870us  36.748us  cudaMemset2DAsync
0.04%  4.8575ms      9871     492ns     353ns  260.80us  cudaGetDevice
0.01%  2.0688ms      1645  1.2570us     894ns  7.9890us  cudaStreamDestroy
0.01%  1.6704ms      1645  1.0150us     493ns  133.13us  cudaStreamCreate
0.01%  802.14us        83  9.6640us     590ns  349.30us  cuDeviceGetAttribute
0.00%  645.00us         1  645.00us  645.00us  645.00us  cudaGetDeviceProperties
0.00%  558.01us      3948     141ns     106ns     303ns  cudaSetDoubleForDevice
0.00%  90.543us         1  90.543us  90.543us  90.543us  cuDeviceTotalMem
0.00%  63.614us         1  63.614us  63.614us  63.614us  cuDeviceGetName
0.00%  3.3740us         2  1.6870us  1.0400us  2.3340us  cuDeviceGetCount
0.00%  1.6930us         2     846ns     773ns     920ns  cuDeviceGet

0 ответов

Другие вопросы по тегам