VisionWorks primitive implementation

I’m new in VisionWorks programminng

today, I knew that openvx only give some primitives, and vendor implement it.

in the visionworks, I know that there is already implemented primitives like canny edge detection. also there is
multiple implementations in one primitives like cpu version… and gpu(cuda) version.

my question is how i can check those implementation version by visionworks programming and nvidia profiler

when i test visionworks sample code, only gpu implemented version is executed.

is there any method to execute cpu implemented version?

and I knew that selecting one of the implemented node of primitives is contorlled inside the visionworks.

is it right?

Hi,

Thanks for your question.

VisionWorks primitives are CUDA optimized except MedianFlow & FindHomography extensions.

85% of VisionWorks OpenVX API is also accelerated with NEON.
Please find more information from VisionWorks document: https://developer.nvidia.com/embedded/dlc/visionworks-1-6-documentation-for-l4t-27-1

Go to “VisionWorks API” > “NVIDIA Extensions API” > "Vision Primitives API”

If you want to check implementation by profiler, please use nvvp:
https://developer.nvidia.com/nvidia-visual-profiler

thanks for answer,
but I already knew that there is CUDA optimized and CPU implementation.
and I already knew that how to use nvvp
sorry, but your reply is different from what i expected.

I already found some information about my question .
in the refrence, there is some api for resource control, “vxSetNodeTarget”

and visionworks release note, there were some other implementations of primitives,
in the release note, some implementation is added when version is changed.

so here is question,

  1. is there some other implementation of primitives for the CPU or GPU?

  2. if i change node to cpu target by “vxSetNodeTarget”, Could I see some node is running on the cpu?
    When I run samples, all implementation ran on the GPU, not CPU.

Hi,

Thanks for your feedback and also sorry for my previous unclear reply.

vx_: Khronos OpenVX API(Nvidia optimized), please find document to check detail implementation. (mentioned in #2)
nvx_
: Nvidia extension API, only GPU implementation is available.
nvxcu_*: Low-level CUDA API, only GPU implementation is available.

Ideally, target should be switched by vxSetNodeTarget.

But we found this function works abnomarllay when target string set to “CPU”.
We are checking this issue internally. Will update information to you later.

Thanks.

Hi,

Please use this API to set target to CPU.

vxSetNodeTarget(node, NVX_TARGET_CPU, NULL)

Thanks for your patience.

Hi @AastaLLL,

I am new in VisionWorks programminng, and i am confused about:

  1. What the difference between vx_, nvx_ and nvxcu_? From your previous answer and official documents, i know that vx_ and nvx_* are both based on openvx framework, but vx is Nvidia optimized and accelerated with NEON. nvxcu_* is based on CUDA and without opencv. Is that right?
  2. Which one is prefer in TX2 platform concerning about efficiency? or Can these be mixed in using and how to do that?

Hi,

  1. vx_ is from the OpenVX standard, nvx_ is Nvidia-extension and nvxcu_ is our low-level API.
    Please check this tutorial for more details.
    https://www.khronos.org/assets/uploads/developers/library/2016-embedded-vision-summit/V2_VisionWorks_OpenVX_tutorial.pdf

  2. If using GPU node, different API should have similar performance.

  3. We also have lots of VisionWorks sample. Please find here:

$ /usr/share/visionworks/sources/install-samples.sh .
$ cd /home/ubuntu/VisionWorks-1.6-Samples