NvSciBuf-CUDA Interop

    /*********** Allocate NvSciBuf object ************/
    // Raw Buffer Attributes for CUDA
    NvSciBufType bufType = NvSciBufType_RawBuffer;
    uint64_t rawsize = SIZE;
    uint64_t align = 0;
    bool cpuaccess_flag = true;
    NvSciBufAttrValAccessPerm perm = NvSciBufAccessPerm_ReadWrite;
    uint64_t gpuId[] = {};
    cuDeviceGetUuid(&uuid, dev));
    gpuid[0] = (uint64_t)uuid.bytes;
    // Fill in values
    NvSciBufAttrKeyValuePair rawbuffattrs[] = {                              
         { NvSciBufGeneralAttrKey_Types, &bufType, sizeof(bufType) },        
         { NvSciBufRawBufferAttrKey_Size, &rawsize, sizeof(rawsize) },       
         { NvSciBufRawBufferAttrKey_Align, &align, sizeof(align) },          
         { NvSciBufGeneralAttrKey_NeedCpuAccess, &cpuaccess_flag,            
                sizeof(cpuaccess_flag) },
         { NvSciBufGeneralAttrKey_RequiredPerm, &perm, sizeof(perm) },
         { NvSciBufGeneralAttrKey_GpuId, &gpuid, sizeof(gpuId) },                                 
    };                                                                       
    // Create list by setting attributes
    err = NvSciBufAttrListSetAttrs(attrListBuffer, rawbuffattrs,               
            sizeof(rawbuffattrs)/sizeof(NvSciBufAttrKeyValuePair)); 
    NvSciBufAttrListCreate(NvSciBufModule, &attrListBuffer);
    // Reconcile And Allocate
    NvSciBufAttrListReconcile(&attrListBuffer, 1, &attrListReconciledBuffer, 
&attrListConflictBuffer)
    NvSciBufObjAlloc(attrListReconciledBuffer, &bufferObjRaw);
    /*************** Query NvSciBuf Object **************/
     NvSciBufAttrKeyValuePair bufattrs[] = {
                {NvSciBufRawBufferAttrKey_Size, NULL, 0},
    };
    NvSciBufAttrListGetAttrs(retList, bufattrs, sizeof(bufattrs)/
sizeof(NvSciBufAttrKeyValuePair)));
    ret_size = *(static_cast<const uint64_t*>(bufattrs[0].value));
    /*************** NvSciBuf Registration With CUDA **************/
    // Fill up CUDA_EXTERNAL_MEMORY_HANDLE_DESC
    cudaExternalMemoryHandleDesc memHandleDesc;
    memset(&memHandleDesc, 0, sizeof(memHandleDesc));
    memHandleDesc.type = cudaExternalMemoryHandleTypeNvSciBuf;
    memHandleDesc.handle.nvSciBufObject = bufferObjRaw;
    memHandleDesc.size = ret_size;
    cudaImportExternalMemory(&extMemBuffer, &memHandleDesc);
    /************** Mapping to CUDA ******************************/
    cudaExternalMemoryBufferDesc bufferDesc;
    memset(&bufferDesc, 0, sizeof(bufferDesc));
    bufferDesc.offset = offset = 0;
    bufferDesc.size = ret_size;
    cudaExternalMemoryGetMappedBuffer(&dptr, extMemBuffer, &bufferDesc);
    /************** CUDA Kernel ***********************************/
    // Run CUDA Kernel on dptr
    /*************** Free CUDA mappings *****************************/
    cudaFree();
    cudaDestroyExternalMemory(extMemBuffer);
    /***************** Free NvSciBuf **********************************/
    NvSciBufAttrListFree(attrListBuffer);
    NvSciBufAttrListFree(attrListReconciledBuffer)
    NvSciBufAttrListFree(attrListConflictBuffer);
    NvSciBufObjFree(bufferObjRaw);