add vxc binary for internal ops (#255)
cmake -DUSE_VXC_BINARY=1 -DVCCOMPILER_PATH=<vcCompiler path> -DGPU_CONFIG_FILE=<gpu config file> ..
This commit is contained in:
parent
4229ad88b3
commit
9813a5da9a
|
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import os
|
||||
import platform
|
||||
import datetime
|
||||
import re
|
||||
import string
|
||||
|
||||
def checkFile(path):
|
||||
return os.path.isfile(path)
|
||||
|
||||
|
||||
def toHex(number):
|
||||
return "0x%08X" % number
|
||||
|
||||
|
||||
def usage():
|
||||
print("ConvertPGMToH: convert VXC PGM file to C header file")
|
||||
print("Usage: ConvertPGMToH [-h] [-a] -i input_file -o output_file")
|
||||
print("Options and arguments:")
|
||||
print(" -h :show this usage")
|
||||
print(" -a :append to the output_file")
|
||||
print(" -i input_file :specify the .gcPGM file which include VXC shader binary")
|
||||
print(" -o output_file :specify the .h file to save converted data")
|
||||
|
||||
|
||||
def ConverBinToH(source, target):
|
||||
global append
|
||||
mmtime = os.path.getmtime(source)
|
||||
|
||||
if checkFile(target):
|
||||
if os.path.getmtime(target) > mmtime:
|
||||
print("%s is already the latest one (nothing changed)" % target)
|
||||
return
|
||||
|
||||
with open(source, "rb") as fin:
|
||||
buf = fin.read()
|
||||
#os.remove(target)
|
||||
bytes = bytearray(buf)
|
||||
|
||||
fout = None
|
||||
if (append):
|
||||
fout = open(target, "a")
|
||||
else:
|
||||
fout = open(target, "w")
|
||||
|
||||
if not (fout):
|
||||
print("ERROR: failed to open file: %s" % (target))
|
||||
|
||||
#fout.write(datetime.datetime.now().strftime("/*Auto created on %Y-%m-%d %H:%M:%S*/\n"))
|
||||
name = os.path.basename(source).replace(".", "_", 1)
|
||||
name = re.sub("_all.gcPGM", "", name);
|
||||
if (append == 0):
|
||||
fout.write("#ifndef __%s_H__\n#define __%s_H__\n\n" % (name.upper(), name.upper()))
|
||||
|
||||
fout.write("static uint8_t vxcBin%s[] = {" % (name))
|
||||
i = 0
|
||||
for c in bytes:
|
||||
if i % 8 == 0:
|
||||
fout.write("\n ")
|
||||
fout.write("0x%02X, " % c)
|
||||
i += 1
|
||||
|
||||
fout.write("\n};\n")
|
||||
fout.write("#define VXC_BIN_%s_LEN 0x%08XU\n" % (name.upper(), i))
|
||||
|
||||
if (append == 0):
|
||||
fout.write("\n#endif\n\n");
|
||||
fout.close()
|
||||
#print("%s is generated/refreshed" % target)
|
||||
return
|
||||
|
||||
def main():
|
||||
global append
|
||||
args = sys.argv
|
||||
argc = len(args)
|
||||
target_path = "."
|
||||
tool = ""
|
||||
source = ""
|
||||
tool_opt = ["-s", "-V"]
|
||||
if argc <= 1:
|
||||
usage()
|
||||
return
|
||||
i = 1
|
||||
while i < argc:
|
||||
if args[i] == "-h":
|
||||
usage()
|
||||
return
|
||||
if args[i] == "-a":
|
||||
append = 1
|
||||
elif args[i] == "-o":
|
||||
i += 1
|
||||
target_path = args[i]
|
||||
elif args[i] == "-i":
|
||||
i += 1
|
||||
source = args[i]
|
||||
else:
|
||||
print("unknown parameter: " + args[i])
|
||||
usage()
|
||||
return
|
||||
i += 1
|
||||
|
||||
if source == "":
|
||||
print("Please specify .c/cpp/h/hpp file")
|
||||
return
|
||||
else:
|
||||
if not checkFile(source):
|
||||
print("Cannot find the file %s" % source)
|
||||
return
|
||||
|
||||
ConverBinToH(source, target_path)
|
||||
return
|
||||
|
||||
|
||||
append = 0
|
||||
if __name__=='__main__':
|
||||
main()
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ -z $4 ]; then
|
||||
echo
|
||||
echo usage:
|
||||
echo " $0 VIV_SDK_PATH VCCOMPILER OVXLIB GPU_CONFIG_FILE"
|
||||
echo
|
||||
echo " VIV_SDK_PATH: VIVANTE SDK path"
|
||||
echo " VCCOMPILER: vcCompiler path"
|
||||
echo " OVXLIB: ovxlib path"
|
||||
echo " GPU_CONFIG_FILE: gpu config file path"
|
||||
echo
|
||||
echo "e.g."
|
||||
echo " ./ovxlib_bin_build.sh VIV_SDK_PATH VCCOMPILER OVXLIB vip8000.config"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export VIV_SDK_PATH=$1
|
||||
export VCCOMPILER=$2
|
||||
export OVXLIB=$3
|
||||
export GPU_CONFIG_FILE=$4
|
||||
|
||||
function convert_vxc_shader()
|
||||
{
|
||||
echo "== convert VXC shader to header files ..."
|
||||
|
||||
VX_BIN_PATH=$OVXLIB/include/libnnext/vx_bin
|
||||
if [ ! -e "$VX_BIN_PATH" ]; then
|
||||
mkdir -p $VX_BIN_PATH
|
||||
fi
|
||||
rm -f $VX_BIN_PATH/*.h
|
||||
|
||||
(
|
||||
cat<<EOF
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (c) 2020 Vivante Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* WARNING! AUTO-GENERATED, DO NOT MODIFY MANUALLY */
|
||||
|
||||
#ifndef __VXC_BINARIES_H__
|
||||
#define __VXC_BINARIES_H__
|
||||
|
||||
EOF
|
||||
)>$VX_BIN_PATH/vxc_binaries.h
|
||||
|
||||
cd $OVXLIB/src/libnnext/ops/vx
|
||||
rm -f *.gcPGM *.vxgcSL
|
||||
|
||||
echo "== generating $VX_BIN_PATH/vxc_binaries.h ..."
|
||||
|
||||
for vxFile in `ls *.vx | sed "s/\.vx//"`
|
||||
do
|
||||
{
|
||||
if [ "${vxFile}" != "vsi_nn_kernel_header" ]; then
|
||||
echo $VCCOMPILER -f${GPU_CONFIG_FILE} -allkernel -cl-viv-gcsl-driver-image \
|
||||
-o${vxFile}_vx -m vsi_nn_kernel_header.vx ${vxFile}.vx
|
||||
$VCCOMPILER -f${GPU_CONFIG_FILE} -allkernel -cl-viv-gcsl-driver-image \
|
||||
-o${vxFile}_vx -m vsi_nn_kernel_header.vx ${vxFile}.vx || exit 1
|
||||
echo "python $OVXLIB/ConvertPGMToH.py -i ${vxFile}_vx_all.gcPGM \
|
||||
-o $VX_BIN_PATH/vxc_bin_${vxFile}_vx.h"
|
||||
python $OVXLIB/ConvertPGMToH.py -i ${vxFile}_vx_all.gcPGM \
|
||||
-o $VX_BIN_PATH/vxc_bin_${vxFile}_vx.h || exit 1
|
||||
echo "#include \"vxc_bin_${vxFile}_vx.h\"" >> $VX_BIN_PATH/vxc_binaries.h
|
||||
fi
|
||||
} &
|
||||
done
|
||||
|
||||
wait
|
||||
echo "== convert VXC shader to header files: success!"
|
||||
echo "== convert VXC shader to header files: success!"
|
||||
echo "== convert VXC shader to header files: success!"
|
||||
rm -f *.gcPGM *.vxgcSL
|
||||
|
||||
cd $OVXLIB/src/libnnext/ops/cl
|
||||
rm -f *.gcPGM *.vxgcSL *.clgcSL
|
||||
|
||||
for vxFile in `ls *.cl | sed "s/\.cl//"`
|
||||
do
|
||||
{
|
||||
if [ "${vxFile}" != "eltwise_ops_helper" ]; then
|
||||
cp ${vxFile}.cl ${vxFile}.vx
|
||||
echo $VCCOMPILER -f${GPU_CONFIG_FILE} -allkernel -cl-viv-gcsl-driver-image \
|
||||
-o${vxFile}_cl -m eltwise_ops_helper.cl ${vxFile}.vx
|
||||
$VCCOMPILER -f${GPU_CONFIG_FILE} -allkernel -cl-viv-gcsl-driver-image \
|
||||
-o${vxFile}_cl -m eltwise_ops_helper.cl ${vxFile}.vx || exit 1
|
||||
echo "python $OVXLIB/ConvertPGMToH.py -i ${vxFile}_cl_all.gcPGM \
|
||||
-o $VX_BIN_PATH/vxc_bin_${vxFile}_cl.h"
|
||||
python $OVXLIB/ConvertPGMToH.py -i ${vxFile}_cl_all.gcPGM \
|
||||
-o $VX_BIN_PATH/vxc_bin_${vxFile}_cl.h || exit 1
|
||||
echo "#include \"vxc_bin_${vxFile}_cl.h\"" >> $VX_BIN_PATH/vxc_binaries.h
|
||||
rm ${vxFile}.vx
|
||||
fi
|
||||
} &
|
||||
done
|
||||
|
||||
wait
|
||||
echo "== convert CL shader to header files: success!"
|
||||
echo "== convert CL shader to header files: success!"
|
||||
echo "== convert CL shader to header files: success!"
|
||||
rm -f *.gcPGM *.vxgcSL *.clgcSL
|
||||
|
||||
(
|
||||
cat<<EOF
|
||||
|
||||
#ifndef _cnt_of_array
|
||||
#define _cnt_of_array( arr ) (sizeof( arr )/sizeof( arr[0] ))
|
||||
#endif
|
||||
|
||||
typedef struct _vsi_nn_vx_bin_resource_item_type
|
||||
{
|
||||
char const* name;
|
||||
uint8_t const* data;
|
||||
uint32_t len;
|
||||
} vsi_nn_vx_bin_resource_item_type;
|
||||
|
||||
const vsi_nn_vx_bin_resource_item_type vx_bin_resource_items_vx[] =
|
||||
{
|
||||
EOF
|
||||
)>>$VX_BIN_PATH/vxc_binaries.h
|
||||
|
||||
cd $OVXLIB/src/libnnext/ops/vx
|
||||
for vxFile in `ls *.vx | sed "s/\.vx//"`
|
||||
do
|
||||
vxFileUpper=`echo ${vxFile} | tr 'a-z' 'A-Z'`
|
||||
if [ "${vxFile}" != "vsi_nn_kernel_header" ]; then
|
||||
echo " {\"${vxFile}_vx\", vxcBin${vxFile}_vx, VXC_BIN_${vxFileUpper}_VX_LEN}," \
|
||||
>> $VX_BIN_PATH/vxc_binaries.h
|
||||
fi
|
||||
done
|
||||
|
||||
(
|
||||
cat<<EOF
|
||||
};
|
||||
|
||||
const int vx_bin_resource_items_vx_cnt = _cnt_of_array(vx_bin_resource_items_vx);
|
||||
|
||||
const vsi_nn_vx_bin_resource_item_type vx_bin_resource_items_cl[] =
|
||||
{
|
||||
EOF
|
||||
)>>$VX_BIN_PATH/vxc_binaries.h
|
||||
|
||||
|
||||
cd $OVXLIB/src/libnnext/ops/cl
|
||||
for vxFile in `ls *.cl | sed "s/\.cl//"`
|
||||
do
|
||||
vxFileUpper=`echo ${vxFile} | tr 'a-z' 'A-Z'`
|
||||
if [ "${vxFile}" != "eltwise_ops_helper" ]; then
|
||||
echo " {\"${vxFile}_cl\", vxcBin${vxFile}_cl, VXC_BIN_${vxFileUpper}_CL_LEN}," \
|
||||
>> $VX_BIN_PATH/vxc_binaries.h
|
||||
fi
|
||||
done
|
||||
(
|
||||
cat<<EOF
|
||||
};
|
||||
|
||||
const int vx_bin_resource_items_cl_cnt = _cnt_of_array(vx_bin_resource_items_cl);
|
||||
|
||||
#endif
|
||||
EOF
|
||||
)>>$VX_BIN_PATH/vxc_binaries.h
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
export VIVANTE_SDK_DIR=$VIV_SDK_PATH
|
||||
convert_vxc_shader
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,8 +1,30 @@
|
|||
message("src/tim/vx/internal")
|
||||
|
||||
option(USE_VXC_BINARY "Use VXC binary file" OFF)
|
||||
|
||||
set(OVXLIB_API_ATTR "__attribute__\(\(visibility\(\"default\"\)\)\)")
|
||||
add_definitions(-DOVXLIB_API=${OVXLIB_API_ATTR})
|
||||
|
||||
if(USE_VXC_BINARY)
|
||||
if(EXTERNAL_VIV_SDK)
|
||||
set(VIV_SDK_PATH ${EXTERNAL_VIV_SDK})
|
||||
else()
|
||||
set(VIV_SDK_PATH ${PROJECT_SOURCE_DIR}/prebuilt-sdk/x86_64_linux)
|
||||
endif()
|
||||
if(NOT VCCOMPILER_PATH)
|
||||
set(VCCOMPILER_PATH ${PROJECT_SOURCE_DIR}/prebuilt-sdk/x86_64_linux/bin/vcCompiler)
|
||||
endif()
|
||||
if(NOT GPU_CONFIG_FILE)
|
||||
message(FATAL_ERROR "Need set GPU_CONFIG_FILE for vxc binary")
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/vx/internal/ovxlib_bin_build.sh
|
||||
${VIV_SDK_PATH} ${VCCOMPILER_PATH}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/vx/internal/ ${GPU_CONFIG_FILE})
|
||||
add_definitions(-DVSI_USE_VXC_BINARY=1)
|
||||
endif()
|
||||
|
||||
|
||||
aux_source_directory(./vx/internal/src INTERNAL_SRC)
|
||||
aux_source_directory(./vx/internal/src/kernel INTERNAL_KERNEL)
|
||||
aux_source_directory(./vx/internal/src/kernel/cl INTERNAL_KERNEL_CL)
|
||||
|
|
|
|||
Loading…
Reference in New Issue