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 = NvSciBufAttrListCreate(module, &attrListBuffer);
    err = NvSciBufAttrListSetAttrs(attrListBuffer, rawbuffattrs,
            sizeof(rawbuffattrs)/sizeof(NvSciBufAttrKeyValuePair));

    // 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);