Skip to content

Commit 6ba85ab

Browse files
[ORO-0] bitcode/cubin linking APIs (#40)
* [ORO-0] Link apis. * [ORO-0] Forgot to add. * [ORO-0] Linking test. * [ORO-0] Add orortcGetBitcode/orortcGetBitcodeSize * [ORO-0] Update link unit tests with comments * [ORO-0] Change test for CUBIN instead of PTX * [ORO-0] Fix loadfile to use binary mode, remove printf in kernel * [ORO-0] Adding hiprtc to workaround the regression in 22.7.1 driver released at 7/26/2022. * [ORO-0] Created win64 subdir. * [ORO-0] Load amdhip first, then hiprtc. * [ORO-0] Remove assert from hiprtc library checks * [ORO-0] Add gfx1030 bitcode for navi21 * [MNN-0] Fix premake and add more link testcases * [ORO-0] Update a link_null_name testcase * [ORO-0] Make unit tests more stable on CUDA * [ORO-0] Update bitcode for gfx1030 * [ORO-0] Add bitcodes for navi1,2, vega * [ORO-0] Add hiprtc.dll and comgr dll * [ORO-0] Add gfx906 bitcodes * [ORO-0] Support unit tests on both HIP and CUDA * [ORO-0] Update dlls and bitcodes * [ORO-0] Update bitcodes and generation script * [ORO-0] Minor fixes in bundled bitcode unit tests * [ORO-0] Fix typo in options * [ORO-0] Fix getCUBIN/PTX signatures * [ORO-0] Fix unit tests and generate fatbin for CUDA * [ORO-0] Regenerate fatbin and fix script * [ORO-0] Cleanup * [ORO-0] Update bundled bitcodes to only contain navi21 for now * [ORO-0] Updated bundled bitcode * [ORO-0] add ORO_LAUNCH_PARAMS_* * [ORO-0] Add unit test for orortcLinkAddFile * [ORO-0] Add unittest scripts for TC * [ORO-0] Set separate LAUNCH_PARAM_END for HIP/CUDA * [ORO-0] Add bitcode+bundled bitcode link test * [ORO-0] Cleanup * [ORO-0] Fix typo in script * [ORO-0] Update linux TC script Co-authored-by: takahiroharada <[email protected]>
1 parent d78fb81 commit 6ba85ab

57 files changed

Lines changed: 814 additions & 159 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Orochi/Orochi.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ orortcResult nvrtc2oro( nvrtcResult a )
186186
return (orortcResult)a;
187187
}
188188

189+
inline orortcResult cu2orortc( CUresult a ) { return (orortcResult)a; }
190+
191+
189192
#define __ORO_FUNC1( cuname, hipname ) if( s_api & ORO_API_CUDADRIVER ) return cu2oro( cu##cuname ); if( s_api == ORO_API_HIP ) return hip2oro( hip##hipname );
190193
#define __ORO_FUNC1X( API, cuname, hipname ) if( API & ORO_API_CUDADRIVER ) return cu2oro( cu##cuname ); if( API == ORO_API_HIP ) return hip2oro( hip##hipname );
191194
//#define __ORO_FUNC2( cudaname, hipname ) if( s_api == ORO_API_CUDA ) return cuda2oro( cuda##cudaname ); if( s_api == ORO_API_HIP ) return hip2oro( hip##hipname );
@@ -727,6 +730,18 @@ orortcResult OROAPI orortcGetProgramLogSize(orortcProgram prog, size_t* logSizeR
727730
GetProgramLogSize( (hiprtcProgram)prog, logSizeRet ) );
728731
return ORORTC_ERROR_INTERNAL_ERROR;
729732
}
733+
orortcResult OROAPI orortcGetBitcode(orortcProgram prog, char* bitcode)
734+
{
735+
__ORORTC_FUNC1( GetCUBIN( (nvrtcProgram)prog, bitcode ),
736+
GetBitcode( (hiprtcProgram)prog, bitcode ) );
737+
return ORORTC_ERROR_INTERNAL_ERROR;
738+
}
739+
orortcResult OROAPI orortcGetBitcodeSize(orortcProgram prog, size_t* bitcodeSizeRet)
740+
{
741+
__ORORTC_FUNC1( GetCUBINSize( (nvrtcProgram)prog, bitcodeSizeRet ),
742+
GetBitcodeSize( (hiprtcProgram)prog, bitcodeSizeRet ) );
743+
return ORORTC_ERROR_INTERNAL_ERROR;
744+
}
730745
orortcResult OROAPI orortcGetCode(orortcProgram prog, char* code)
731746
{
732747
__ORORTC_FUNC1( GetPTX( (nvrtcProgram)prog, code ),
@@ -740,6 +755,49 @@ orortcResult OROAPI orortcGetCodeSize(orortcProgram prog, size_t* codeSizeRet)
740755
return ORORTC_ERROR_INTERNAL_ERROR;
741756
}
742757

758+
orortcResult OROAPI orortcLinkCreate( unsigned int num_options, orortcJIT_option* option_ptr, void** option_vals_pptr, orortcLinkState* link_state_ptr )
759+
{
760+
if( s_api & ORO_API_CUDADRIVER )
761+
return cu2orortc( cuLinkCreate( num_options, (CUjit_option*)option_ptr, option_vals_pptr, (CUlinkState*)link_state_ptr ) );
762+
else
763+
return hiprtc2oro( hiprtcLinkCreate( num_options, (hiprtcJIT_option*)option_ptr, option_vals_pptr, (hiprtcLinkState*)link_state_ptr ) );
764+
765+
return ORORTC_ERROR_INTERNAL_ERROR;
766+
}
767+
orortcResult OROAPI orortcLinkAddFile( orortcLinkState link_state_ptr, orortcJITInputType input_type, const char* file_path, unsigned int num_options, orortcJIT_option* options_ptr, void** option_values )
768+
{
769+
if( s_api & ORO_API_CUDADRIVER )
770+
return cu2orortc( cuLinkAddFile( (CUlinkState)link_state_ptr, (CUjitInputType)input_type, file_path, num_options, (CUjit_option*)options_ptr, option_values ) );
771+
else
772+
return hiprtc2oro( hiprtcLinkAddFile( (hiprtcLinkState)link_state_ptr, (hiprtcJITInputType)input_type, file_path, num_options, (hiprtcJIT_option*)options_ptr, option_values ) );
773+
return ORORTC_ERROR_INTERNAL_ERROR;
774+
}
775+
orortcResult OROAPI orortcLinkAddData( orortcLinkState link_state_ptr, orortcJITInputType input_type, void* image, size_t image_size, const char* name, unsigned int num_options, orortcJIT_option* options_ptr, void** option_values )
776+
{
777+
if( s_api & ORO_API_CUDADRIVER )
778+
return cu2orortc( cuLinkAddData( (CUlinkState)link_state_ptr, (CUjitInputType)input_type, image, image_size, name, num_options, (CUjit_option*)options_ptr ,option_values ) );
779+
else
780+
return hiprtc2oro( hiprtcLinkAddData( (hiprtcLinkState)link_state_ptr, (hiprtcJITInputType)input_type, image, image_size, name, num_options, (hiprtcJIT_option*)options_ptr, option_values ) );
781+
return ORORTC_ERROR_INTERNAL_ERROR;
782+
}
783+
orortcResult OROAPI orortcLinkComplete( orortcLinkState link_state_ptr, void** bin_out, size_t* size_out )
784+
{
785+
if( s_api & ORO_API_CUDADRIVER )
786+
return cu2orortc( cuLinkComplete( (CUlinkState)link_state_ptr, bin_out, size_out ) );
787+
else
788+
return hiprtc2oro( hiprtcLinkComplete( (hiprtcLinkState)link_state_ptr, bin_out, size_out ) );
789+
return ORORTC_ERROR_INTERNAL_ERROR;
790+
}
791+
orortcResult OROAPI orortcLinkDestroy( orortcLinkState link_state_ptr )
792+
{
793+
if( s_api & ORO_API_CUDADRIVER )
794+
return cu2orortc( cuLinkDestroy( (CUlinkState)link_state_ptr ) );
795+
else
796+
return hiprtc2oro( hiprtcLinkDestroy( (hiprtcLinkState)link_state_ptr ) );
797+
798+
return ORORTC_ERROR_INTERNAL_ERROR;
799+
}
800+
743801
// Implementation of oroPointerGetAttributes is hacky due to differences between CUDA and HIP
744802
oroError OROAPI oroPointerGetAttributes(oroPointerAttribute* attr, oroDeviceptr dptr)
745803
{

Orochi/Orochi.h

Lines changed: 61 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,18 @@ typedef struct ioroStream_t* oroStream;
146146
typedef struct ioroPointerAttribute_t* oroPointerAttribute;
147147
typedef unsigned long long oroTextureObject;
148148
typedef void* oroExternalMemory_t;
149-
149+
typedef struct iorortcLinkState* orortcLinkState;
150150
typedef struct _orortcProgram* orortcProgram;
151151

152152
#define oroHostRegisterPortable 0x01
153153
#define oroHostRegisterMapped 0x02
154154
#define oroHostRegisterIoMemory 0x04
155155

156+
#define ORO_LAUNCH_PARAM_BUFFER_POINTER ((void*)0x01)
157+
#define ORO_LAUNCH_PARAM_BUFFER_SIZE ((void*)0x02)
158+
#define ORO_HIP_LAUNCH_PARAM_END ((void*)0x03)
159+
#define ORO_CUDA_LAUNCH_PARAM_END ((void*)0x00)
160+
156161
enum orortcResult
157162
{
158163
ORORTC_SUCCESS = 0,
@@ -482,157 +487,52 @@ typedef enum oroJitOption {
482487
oroJitOptionFastCompile,
483488
oroJitOptionNumOptions,
484489
} oroJitOption;
485-
/*
486-
typedef enum HIPjit_target_enum {
487-
ORO_TARGET_COMPUTE_20 = 20,
488-
ORO_TARGET_COMPUTE_21 = 21,
489-
ORO_TARGET_COMPUTE_30 = 30,
490-
ORO_TARGET_COMPUTE_32 = 32,
491-
ORO_TARGET_COMPUTE_35 = 35,
492-
ORO_TARGET_COMPUTE_37 = 37,
493-
ORO_TARGET_COMPUTE_50 = 50,
494-
ORO_TARGET_COMPUTE_52 = 52,
495-
ORO_TARGET_COMPUTE_53 = 53,
496-
ORO_TARGET_COMPUTE_60 = 60,
497-
ORO_TARGET_COMPUTE_61 = 61,
498-
ORO_TARGET_COMPUTE_62 = 62,
499-
ORO_TARGET_COMPUTE_70 = 70,
500-
ORO_TARGET_COMPUTE_73 = 73,
501-
ORO_TARGET_COMPUTE_75 = 75,
502-
} HIPjit_target;
503-
504-
typedef enum HIPjit_fallback_enum {
505-
ORO_PREFER_PTX = 0,
506-
ORO_PREFER_BINARY,
507-
} HIPjit_fallback;
508-
509-
typedef enum HIPjit_cacheMode_enum {
510-
ORO_JIT_CACHE_OPTION_NONE = 0,
511-
ORO_JIT_CACHE_OPTION_CG,
512-
ORO_JIT_CACHE_OPTION_CA,
513-
} HIPjit_cacheMode;
514-
515-
typedef enum HIPjitInputType_enum {
516-
ORO_JIT_INPUT_HIPBIN = 0,
517-
ORO_JIT_INPUT_PTX,
518-
ORO_JIT_INPUT_FATBINARY,
519-
ORO_JIT_INPUT_OBJECT,
520-
ORO_JIT_INPUT_LIBRARY,
521-
ORO_JIT_NUM_INPUT_TYPES,
522-
} HIPjitInputType;
523-
524-
typedef struct HIPlinkState_st* HIPlinkState;
525-
526-
typedef enum hipGLDeviceList {
527-
hipGLDeviceListAll = 1, ///< All hip devices used by current OpenGL context.
528-
hipGLDeviceListCurrentFrame = 2, ///< Hip devices used by current OpenGL context in current
529-
///< frame
530-
hipGLDeviceListNextFrame = 3 ///< Hip devices used by current OpenGL context in next
531-
///< frame.
532-
} hipGLDeviceList;
533-
534-
typedef enum hipGraphicsRegisterFlags {
535-
hipGraphicsRegisterFlagsNone = 0,
536-
hipGraphicsRegisterFlagsReadOnly = 1, ///< HIP will not write to this registered resource
537-
hipGraphicsRegisterFlagsWriteDiscard =
538-
2, ///< HIP will only write and will not read from this registered resource
539-
hipGraphicsRegisterFlagsSurfaceLoadStore = 4, ///< HIP will bind this resource to a surface
540-
hipGraphicsRegisterFlagsTextureGather =
541-
8 ///< HIP will perform texture gather operations on this registered resource
542-
} hipGraphicsRegisterFlags;
543-
544-
typedef enum HIPgraphicsRegisterFlags_enum {
545-
ORO_GRAPHICS_REGISTER_FLAGS_NONE = 0x00,
546-
ORO_GRAPHICS_REGISTER_FLAGS_READ_ONLY = 0x01,
547-
ORO_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD = 0x02,
548-
ORO_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST = 0x04,
549-
ORO_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER = 0x08,
550-
} HIPgraphicsRegisterFlags;
551-
552-
typedef enum HIPgraphicsMapResourceFlags_enum {
553-
ORO_GRAPHICS_MAP_RESOURCE_FLAGS_NONE = 0x00,
554-
ORO_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY = 0x01,
555-
ORO_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD = 0x02,
556-
} HIPgraphicsMapResourceFlags;
557-
558-
typedef enum HIParray_cubemap_face_enum {
559-
ORO_HIPBEMAP_FACE_POSITIVE_X = 0x00,
560-
ORO_HIPBEMAP_FACE_NEGATIVE_X = 0x01,
561-
ORO_HIPBEMAP_FACE_POSITIVE_Y = 0x02,
562-
ORO_HIPBEMAP_FACE_NEGATIVE_Y = 0x03,
563-
ORO_HIPBEMAP_FACE_POSITIVE_Z = 0x04,
564-
ORO_HIPBEMAP_FACE_NEGATIVE_Z = 0x05,
565-
} HIParray_cubemap_face;
566-
567-
typedef enum hipLimit_t {
568-
ORO_LIMIT_STACK_SIZE = 0x00,
569-
ORO_LIMIT_PRINTF_FIFO_SIZE = 0x01,
570-
hipLimitMallocHeapSize = 0x02,
571-
ORO_LIMIT_DEV_RUNTIME_SYNC_DEPTH = 0x03,
572-
ORO_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT = 0x04,
573-
ORO_LIMIT_MAX,
574-
} hipLimit_t;
575-
576-
typedef enum hipResourceType {
577-
hipResourceTypeArray = 0x00,
578-
hipResourceTypeMipmaoroedArray = 0x01,
579-
hipResourceTypeLinear = 0x02,
580-
hipResourceTypePitch2D = 0x03,
581-
} hipResourceType;
582-
583-
typedef enum hipError_t {
584-
hipSuccess = 0,
585-
hipErrorInvalidValue = 1,
586-
hipErrorOutOfMemory = 2,
587-
hipErrorNotInitialized = 3,
588-
hipErrorDeinitialized = 4,
589-
hipErrorProfilerDisabled = 5,
590-
hipErrorProfilerNotInitialized = 6,
591-
hipErrorProfilerAlreadyStarted = 7,
592-
hipErrorProfilerAlreadyStooroed = 8,
593-
hipErrorNoDevice = 100,
594-
hipErrorInvalidDevice = 101,
595-
hipErrorInvalidImage = 200,
596-
hipErrorInvalidContext = 201,
597-
hipErrorContextAlreadyCurrent = 202,
598-
hipErrorMapFailed = 205,
599-
hipErrorUnmapFailed = 206,
600-
hipErrorArrayIsMaoroed = 207,
601-
hipErrorAlreadyMaoroed = 208,
602-
hipErrorNoBinaryForGpu = 209,
603-
hipErrorAlreadyAcquired = 210,
604-
hipErrorNotMaoroed = 211,
605-
hipErrorNotMaoroedAsArray = 212,
606-
hipErrorNotMaoroedAsPointer = 213,
607-
hipErrorECCNotCorrectable = 214,
608-
hipErrorUnsuoroortedLimit = 215,
609-
hipErrorContextAlreadyInUse = 216,
610-
hipErrorPeerAccessUnsuoroorted = 217,
611-
hipErrorInvalidKernelFile = 218,
612-
hipErrorInvalidGraphicsContext = 219,
613-
hipErrorInvalidSource = 300,
614-
hipErrorFileNotFound = 301,
615-
hipErrorSharedObjectSymbolNotFound = 302,
616-
hipErrorSharedObjectInitFailed = 303,
617-
hipErrorOperatingSystem = 304,
618-
hipErrorInvalidHandle = 400,
619-
hipErrorNotFound = 500,
620-
hipErrorNotReady = 600,
621-
hipErrorIllegalAddress = 700,
622-
hipErrorLaunchOutOfResources = 701,
623-
hipErrorLaunchTimeOut = 702,
624-
hipErrorPeerAccessAlreadyEnabled = 704,
625-
hipErrorPeerAccessNotEnabled = 705,
626-
hipErrorSetOnActiveProcess = 708,
627-
hipErrorAssert = 710,
628-
hipErrorHostMemoryAlreadyRegistered = 712,
629-
hipErrorHostMemoryNotRegistered = 713,
630-
hipErrorLaunchFailure = 719,
631-
hipErrorCooperativeLaunchTooLarge = 720,
632-
hipErrorNotSuoroorted = 801,
633-
hipErrorUnknown = 999,
634-
} hipError_t;
635-
*/
490+
491+
typedef enum orortcJIT_option
492+
{
493+
ORORTC_JIT_MAX_REGISTERS = 0,
494+
ORORTC_JIT_THREADS_PER_BLOCK,
495+
ORORTC_JIT_WALL_TIME,
496+
ORORTC_JIT_INFO_LOG_BUFFER,
497+
ORORTC_JIT_INFO_LOG_BUFFER_SIZE_BYTES,
498+
ORORTC_JIT_ERROR_LOG_BUFFER,
499+
ORORTC_JIT_ERROR_LOG_BUFFER_SIZE_BYTES,
500+
ORORTC_JIT_OPTIMIZATION_LEVEL,
501+
ORORTC_JIT_TARGET_FROM_HIPCONTEXT,
502+
ORORTC_JIT_TARGET,
503+
ORORTC_JIT_FALLBACK_STRATEGY,
504+
ORORTC_JIT_GENERATE_DEBUG_INFO,
505+
ORORTC_JIT_LOG_VERBOSE,
506+
ORORTC_JIT_GENERATE_LINE_INFO,
507+
ORORTC_JIT_CACHE_MODE,
508+
ORORTC_JIT_NEW_SM3X_OPT,
509+
ORORTC_JIT_FAST_COMPILE,
510+
ORORTC_JIT_GLOBAL_SYMBOL_NAMES,
511+
ORORTC_JIT_GLOBAL_SYMBOL_ADDRESS,
512+
ORORTC_JIT_GLOBAL_SYMBOL_COUNT,
513+
ORORTC_JIT_LTO,
514+
ORORTC_JIT_FTZ,
515+
ORORTC_JIT_PREC_DIV,
516+
ORORTC_JIT_PREC_SQRT,
517+
ORORTC_JIT_FMA,
518+
ORORTC_JIT_NUM_OPTIONS,
519+
} orortcJIT_option;
520+
521+
typedef enum orortcJITInputType
522+
{
523+
ORORTC_JIT_INPUT_CUBIN = 0,
524+
ORORTC_JIT_INPUT_PTX,
525+
ORORTC_JIT_INPUT_FATBINARY,
526+
ORORTC_JIT_INPUT_OBJECT,
527+
ORORTC_JIT_INPUT_LIBRARY,
528+
ORORTC_JIT_INPUT_NVVM,
529+
ORORTC_JIT_NUM_LEGACY_INPUT_TYPES,
530+
ORORTC_JIT_INPUT_LLVM_BITCODE = 100,
531+
ORORTC_JIT_INPUT_LLVM_BUNDLED_BITCODE = 101,
532+
ORORTC_JIT_INPUT_LLVM_ARCHIVES_OF_BUNDLED_BITCODE = 102,
533+
ORORTC_JIT_NUM_INPUT_TYPES = ( ORORTC_JIT_NUM_LEGACY_INPUT_TYPES + 3 )
534+
} orortcJITInputType;
535+
636536

637537
typedef enum oroExternalMemoryHandleType_enum {
638538
oroExternalMemoryHandleTypeOpaqueFd = 1,
@@ -811,9 +711,18 @@ orortcResult OROAPI orortcDestroyProgram(orortcProgram* prog);
811711
orortcResult OROAPI orortcGetLoweredName(orortcProgram prog, const char* name_expression, const char** lowered_name);
812712
orortcResult OROAPI orortcGetProgramLog(orortcProgram prog, char* log);
813713
orortcResult OROAPI orortcGetProgramLogSize(orortcProgram prog, size_t* logSizeRet);
714+
orortcResult OROAPI orortcGetBitcode( orortcProgram prog, char* bitcode );
715+
orortcResult OROAPI orortcGetBitcodeSize( orortcProgram prog, size_t* bitcodeSizeRet );
814716
orortcResult OROAPI orortcGetCode(orortcProgram prog, char* code);
815717
orortcResult OROAPI orortcGetCodeSize(orortcProgram prog, size_t* codeSizeRet);
816718

719+
orortcResult OROAPI orortcLinkCreate( unsigned int num_options, orortcJIT_option* option_ptr, void** option_vals_pptr, orortcLinkState* link_state_ptr );
720+
orortcResult OROAPI orortcLinkAddFile( orortcLinkState link_state_ptr, orortcJITInputType input_type, const char* file_path, unsigned int num_options, orortcJIT_option* options_ptr, void** option_values );
721+
orortcResult OROAPI orortcLinkAddData( orortcLinkState link_state_ptr, orortcJITInputType input_type, void* image, size_t image_size, const char* name, unsigned int num_options, orortcJIT_option* options_ptr, void** option_values );
722+
orortcResult OROAPI orortcLinkComplete( orortcLinkState link_state_ptr, void** bin_out, size_t* size_out );
723+
orortcResult OROAPI orortcLinkDestroy( orortcLinkState link_state_ptr );
724+
725+
817726

818727
enum {
819728
ORO_SUCCESS = 0,

Orochi/OrochiUtils.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,11 @@ OrochiUtils::~OrochiUtils()
390390
{
391391
}
392392

393+
bool OrochiUtils::readSourceCode( const std::string& path, std::string& sourceCode, std::vector<std::string>* includes )
394+
{
395+
return OrochiUtilsImpl::readSourceCode( path, sourceCode, includes );
396+
}
397+
393398
oroFunction OrochiUtils::getFunctionFromFile( oroDevice device, const char* path, const char* funcName, std::vector<const char*>* optsIn )
394399
{
395400
const std::string cacheName = OrochiUtilsImpl::getCacheName( path, funcName );
@@ -491,6 +496,58 @@ oroFunction OrochiUtils::getFunction( oroDevice device, const char* code, const
491496
return function;
492497
}
493498

499+
void OrochiUtils::getData( oroDevice device, const char* code, const char* path, std::vector<const char*>* optsIn, std::vector<char>& dst )
500+
{
501+
std::vector<const char*> opts;
502+
opts.push_back( "-std=c++17" );
503+
504+
std::string tmp = "--gpu-architecture=";
505+
506+
if( oroGetCurAPI(0) == ORO_API_HIP )
507+
{
508+
oroDeviceProp props;
509+
oroGetDeviceProperties( &props, device );
510+
tmp += props.gcnArchName;
511+
opts.push_back( tmp.c_str() );
512+
}
513+
514+
if( optsIn )
515+
{
516+
for( int i = 0; i < optsIn->size(); i++ )
517+
opts.push_back( ( *optsIn )[i] );
518+
}
519+
// if( oroGetCurAPI(0) == ORO_API_CUDA )
520+
// opts.push_back( "-G" );
521+
522+
oroFunction function;
523+
std::vector<char>& codec = dst;
524+
{
525+
orortcProgram prog;
526+
orortcResult e;
527+
e = orortcCreateProgram( &prog, code, path, 0, 0, 0 );
528+
529+
e = orortcCompileProgram( prog, opts.size(), opts.data() );
530+
if( e != ORORTC_SUCCESS )
531+
{
532+
size_t logSize;
533+
orortcGetProgramLogSize( prog, &logSize );
534+
if( logSize )
535+
{
536+
std::string log( logSize, '\0' );
537+
orortcGetProgramLog( prog, &log[0] );
538+
std::cout << log << '\n';
539+
};
540+
}
541+
size_t codeSize;
542+
e = orortcGetBitcodeSize( prog, &codeSize );
543+
544+
codec.resize( codeSize );
545+
e = orortcGetBitcode( prog, codec.data() );
546+
e = orortcDestroyProgram( &prog );
547+
}
548+
return;
549+
}
550+
494551
void OrochiUtils::launch1D( oroFunction func, int nx, const void** args, int wgSize, unsigned int sharedMemBytes )
495552
{
496553
int4 tpb = { wgSize, 1, 0 };

0 commit comments

Comments
 (0)