2017-12-21 07:45:38 +08:00
/*
2020-02-07 01:57:00 +08:00
* Copyright ( C ) 2017 - 2020 Intel Corporation
2017-12-21 07:45:38 +08:00
*
2018-09-18 15:11:08 +08:00
* SPDX - License - Identifier : MIT
2017-12-21 07:45:38 +08:00
*
*/
2019-12-13 23:48:57 +08:00
# include "core/debug_settings/debug_settings_manager.h"
2020-02-07 01:57:00 +08:00
# include "core/device/device.h"
2020-02-23 05:50:57 +08:00
# include "opencl/source/built_ins/built_ins.h"
# include "opencl/source/built_ins/builtins_dispatch_builder.h"
2019-02-27 18:39:32 +08:00
2018-02-02 17:33:31 +08:00
# include "os_inc.h"
2017-12-21 07:45:38 +08:00
2019-02-27 18:39:32 +08:00
# include <cstdint>
2019-03-26 18:59:46 +08:00
namespace NEO {
2017-12-21 07:45:38 +08:00
2019-07-05 16:31:32 +08:00
const char * getBuiltinAsString ( EBuiltInOps : : Type builtin ) {
2020-02-20 23:00:19 +08:00
const char * builtinString = getAdditionalBuiltinAsString ( builtin ) ;
if ( builtinString ) {
return builtinString ;
}
2017-12-21 07:45:38 +08:00
switch ( builtin ) {
default :
2019-07-05 16:31:32 +08:00
return getUnknownBuiltinAsString ( builtin ) ;
2018-08-07 15:22:55 +08:00
case EBuiltInOps : : AuxTranslation :
2020-02-21 15:32:20 +08:00
return " aux_translation.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferToBuffer :
2020-02-21 15:32:20 +08:00
return " copy_buffer_to_buffer.builtin_kernel " ;
2019-10-10 00:20:12 +08:00
case EBuiltInOps : : CopyBufferToBufferStateless :
2020-02-21 15:32:20 +08:00
return " copy_buffer_to_buffer_stateless.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferRect :
2020-02-21 15:32:20 +08:00
return " copy_buffer_rect.builtin_kernel " ;
2019-10-16 18:46:34 +08:00
case EBuiltInOps : : CopyBufferRectStateless :
2020-02-21 15:32:20 +08:00
return " copy_buffer_rect_stateless.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : FillBuffer :
2020-02-21 15:32:20 +08:00
return " fill_buffer.builtin_kernel " ;
2019-10-29 21:23:32 +08:00
case EBuiltInOps : : FillBufferStateless :
2020-02-21 15:32:20 +08:00
return " fill_buffer_stateless.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyBufferToImage3d :
2020-02-21 15:32:20 +08:00
return " copy_buffer_to_image3d.builtin_kernel " ;
2019-11-14 22:25:38 +08:00
case EBuiltInOps : : CopyBufferToImage3dStateless :
2020-02-21 15:32:20 +08:00
return " copy_buffer_to_image3d_stateless.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyImage3dToBuffer :
2020-02-21 15:32:20 +08:00
return " copy_image3d_to_buffer.builtin_kernel " ;
2019-11-14 22:48:30 +08:00
case EBuiltInOps : : CopyImage3dToBufferStateless :
2020-02-21 15:32:20 +08:00
return " copy_image3d_to_buffer_stateless.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyImageToImage1d :
2020-02-21 15:32:20 +08:00
return " copy_image_to_image1d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyImageToImage2d :
2020-02-21 15:32:20 +08:00
return " copy_image_to_image2d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : CopyImageToImage3d :
2020-02-21 15:32:20 +08:00
return " copy_image_to_image3d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : FillImage1d :
2020-02-21 15:32:20 +08:00
return " fill_image1d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : FillImage2d :
2020-02-21 15:32:20 +08:00
return " fill_image2d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
case EBuiltInOps : : FillImage3d :
2020-02-21 15:32:20 +08:00
return " fill_image3d.builtin_kernel " ;
2017-12-21 07:45:38 +08:00
} ;
}
BuiltinResourceT createBuiltinResource ( const char * ptr , size_t size ) {
return BuiltinResourceT ( ptr , ptr + size ) ;
}
BuiltinResourceT createBuiltinResource ( const BuiltinResourceT & r ) {
return BuiltinResourceT ( r ) ;
}
2019-07-05 16:31:32 +08:00
std : : string createBuiltinResourceName ( EBuiltInOps : : Type builtin , const std : : string & extension ,
2017-12-21 07:45:38 +08:00
const std : : string & platformName , uint32_t deviceRevId ) {
std : : string ret ;
if ( platformName . size ( ) > 0 ) {
ret = platformName ;
ret + = " _ " + std : : to_string ( deviceRevId ) ;
ret + = " _ " ;
}
ret + = getBuiltinAsString ( builtin ) ;
if ( extension . size ( ) > 0 ) {
ret + = extension ;
}
return ret ;
}
std : : string joinPath ( const std : : string & lhs , const std : : string & rhs ) {
if ( lhs . size ( ) = = 0 ) {
return rhs ;
}
if ( rhs . size ( ) = = 0 ) {
return lhs ;
}
if ( * lhs . rbegin ( ) = = PATH_SEPARATOR ) {
return lhs + rhs ;
}
return lhs + PATH_SEPARATOR + rhs ;
}
std : : string getDriverInstallationPath ( ) {
return " " ;
}
BuiltinResourceT Storage : : load ( const std : : string & resourceName ) {
return loadImpl ( joinPath ( rootPath , resourceName ) ) ;
}
BuiltinResourceT FileStorage : : loadImpl ( const std : : string & fullResourceName ) {
BuiltinResourceT ret ;
std : : ifstream f { fullResourceName , std : : ios : : in | std : : ios : : binary | std : : ios : : ate } ;
auto end = f . tellg ( ) ;
f . seekg ( 0 , std : : ios : : beg ) ;
auto beg = f . tellg ( ) ;
auto s = end - beg ;
ret . resize ( static_cast < size_t > ( s ) ) ;
f . read ( ret . data ( ) , s ) ;
return ret ;
}
const BuiltinResourceT * EmbeddedStorageRegistry : : get ( const std : : string & name ) const {
auto it = resources . find ( name ) ;
if ( resources . end ( ) = = it ) {
return nullptr ;
}
return & it - > second ;
}
BuiltinResourceT EmbeddedStorage : : loadImpl ( const std : : string & fullResourceName ) {
auto * constResource = EmbeddedStorageRegistry : : getInstance ( ) . get ( fullResourceName ) ;
if ( constResource = = nullptr ) {
BuiltinResourceT ret ;
return ret ;
}
return createBuiltinResource ( * constResource ) ;
}
BuiltinsLib : : BuiltinsLib ( ) {
allStorages . push_back ( std : : unique_ptr < Storage > ( new EmbeddedStorage ( " " ) ) ) ;
allStorages . push_back ( std : : unique_ptr < Storage > ( new FileStorage ( getDriverInstallationPath ( ) ) ) ) ;
}
2019-07-05 16:31:32 +08:00
BuiltinCode BuiltinsLib : : getBuiltinCode ( EBuiltInOps : : Type builtin , BuiltinCode : : ECodeType requestedCodeType , Device & device ) {
2017-12-21 07:45:38 +08:00
std : : lock_guard < std : : mutex > lockRaii { mutex } ;
BuiltinResourceT bc ;
BuiltinCode : : ECodeType usedCodetType = BuiltinCode : : ECodeType : : INVALID ;
2018-06-09 04:40:27 +08:00
2017-12-21 07:45:38 +08:00
if ( requestedCodeType = = BuiltinCode : : ECodeType : : Any ) {
2018-06-09 04:40:27 +08:00
uint32_t codeType = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : Binary ) ;
if ( DebugManager . flags . RebuildPrecompiledKernels . get ( ) ) {
codeType = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : Source ) ;
}
for ( uint32_t e = static_cast < uint32_t > ( BuiltinCode : : ECodeType : : COUNT ) ;
2017-12-21 07:45:38 +08:00
codeType ! = e ; + + codeType ) {
bc = getBuiltinResource ( builtin , static_cast < BuiltinCode : : ECodeType > ( codeType ) , device ) ;
if ( bc . size ( ) > 0 ) {
usedCodetType = static_cast < BuiltinCode : : ECodeType > ( codeType ) ;
break ;
}
}
} else {
bc = getBuiltinResource ( builtin , requestedCodeType , device ) ;
usedCodetType = requestedCodeType ;
}
BuiltinCode ret ;
std : : swap ( ret . resource , bc ) ;
ret . type = usedCodetType ;
ret . targetDevice = & device ;
return ret ;
}
2020-02-20 15:12:44 +08:00
std : : unique_ptr < Program > BuiltinsLib : : createProgramFromCode ( const BuiltinCode & bc , Device & device ) {
2017-12-21 07:45:38 +08:00
std : : unique_ptr < Program > ret ;
const char * data = bc . resource . data ( ) ;
size_t dataLen = bc . resource . size ( ) ;
cl_int err = 0 ;
switch ( bc . type ) {
default :
break ;
case BuiltinCode : : ECodeType : : Source :
case BuiltinCode : : ECodeType : : Intermediate :
2020-02-20 15:12:44 +08:00
ret . reset ( Program : : create ( data , nullptr , device , true , & err ) ) ;
2017-12-21 07:45:38 +08:00
break ;
case BuiltinCode : : ECodeType : : Binary :
2020-02-20 15:12:44 +08:00
ret . reset ( Program : : createFromGenBinary ( * device . getExecutionEnvironment ( ) , nullptr , data , dataLen , true , nullptr , & device ) ) ;
2017-12-21 07:45:38 +08:00
break ;
}
return ret ;
}
2019-07-05 16:31:32 +08:00
BuiltinResourceT BuiltinsLib : : getBuiltinResource ( EBuiltInOps : : Type builtin , BuiltinCode : : ECodeType requestedCodeType , Device & device ) {
2017-12-21 07:45:38 +08:00
BuiltinResourceT bc ;
std : : string resourceNameGeneric = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) ) ;
2019-08-26 21:36:24 +08:00
std : : string resourceNameForPlatformType = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) , getFamilyNameWithType ( device . getHardwareInfo ( ) ) ) ;
std : : string resourceNameForPlatformTypeAndStepping = createBuiltinResourceName ( builtin , BuiltinCode : : getExtension ( requestedCodeType ) , getFamilyNameWithType ( device . getHardwareInfo ( ) ) ,
2019-05-08 22:00:24 +08:00
device . getHardwareInfo ( ) . platform . usRevId ) ;
2017-12-21 07:45:38 +08:00
2018-04-18 00:11:50 +08:00
for ( auto & rn : { resourceNameForPlatformTypeAndStepping , resourceNameForPlatformType , resourceNameGeneric } ) { // first look for dedicated version, only fallback to generic one
2017-12-21 07:45:38 +08:00
for ( auto & s : allStorages ) {
bc = s . get ( ) - > load ( rn ) ;
if ( bc . size ( ) ! = 0 ) {
return bc ;
}
}
}
return bc ;
}
2019-03-26 18:59:46 +08:00
} // namespace NEO