diff --git a/CMakeLists.txt b/CMakeLists.txt index ea3739c8..d3720234 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,16 +5,35 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON ) # Utility functions include(cmake/util/Util.cmake) -include(cmake/util/FindCUDA.cmake) -include(cmake/util/FindOpenmp.cmake) +#include(cmake/util/FindCUDA.cmake) +#include(cmake/util/FindOpenmp.cmake) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/config.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/config.cmake) endif() +if(USE_RISCV) + message(STATUS "using riscv") + set(CMAKE_SYSTEM_NAME Generic) + set(CMAKE_SYSTEM_PROCESSOR riscv) + set(CMAKE_CROSSCOMPILING 1) + set(CMAKE_CXX_COMPILER "riscv64-unknown-linux-gnu-g++") + set(CMAKE_C_COMPILER "riscv64-unknown-linux-gnu-gcc") + set(CMAKE_ASM_COMPILER "riscv64-unknown-linux-gnu-gcc") + set(CMAKE_LINKER "riscv64-unknown-linux-gnu-ld") + set(CMAKE_AR "riscv64-unknown-linux-gnu-ar") + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_EXPORT_COMPILE_COMMANDS 1) + +endif() + # include directories include_directories("include") + # Generic compilation options set(CMAKE_C_FLAGS "-fsigned-char -Wall -fPIC ${CMAKE_C_FLAGS}") set(CMAKE_CXX_FLAGS "-fsigned-char -Wall -fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") diff --git a/Makefile b/Makefile index 72490a3b..ca87a081 100644 --- a/Makefile +++ b/Makefile @@ -41,5 +41,8 @@ test_opencl: ${TEST_OPENCL} %_opencl: ${TESTS}/%.cc lib g++ -o ${BUILD}/${TESTS}/$@ $< -DDEVICE=3 -std=c++11 -I${INCLUDE} -L${BUILD} -lcvm_runtime -fopenmp -L/usr/local/cuda/lib64/ -lOpenCL -fsigned-char -pthread -Wl,-rpath=${BUILD} +#objs := $(wildcard ${BUILD}/obj/*.o) +%_riscv: ${TESTS}/%.cc lib + riscv64-unknown-linux-gnu-g++ -o ${BUILD}/${TESTS}/$@ $< -DDEVICE=0 -std=c++11 -I${INCLUDE} -L${BUILD} -pthread -lcvm -fsigned-char -Wl,-rpath=${BUILD} clean: rm -rf ./build/* diff --git a/README.md b/README.md index 1ea69886..409266e3 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,87 @@ -# cvm-runtime -CVM Runtime +# Test the cvm-runtime under QEMU with RISC-V support +## Config The QEMU Environment +1. mkdir riscv64-linux +2. cd riscv64-linux +### riscv-gnu-toolchain +``` +1. git clone --recursive https://github.com/riscv/riscv-gnu-toolchain +2. sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev +3. cd riscv-gnu-toolchain && ./configure --prefix=/opt/riscv +4. make linux +5. export RISCV=/opt/riscv +6. export PATH=$PATH:$RISCV/bin +``` +### qemu +``` +1. git clone https://github.com/qemu/qemu +2. cd qemu && git checkout v3.0.0 +3. ./configure --target-list=riscv64-softmmu +(sudo apt-get install libpixman-1-dev) +4. make -j $(nproc) +5. sudo make install +``` +### linux kernel +``` +1. git clone https://github.com/torvalds/linux.git +2. cd linux && git checkout v4.19-rc3 +3. make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig +4. make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc) +``` -## Latency +### busybear-linux +``` +1. git clone https://github.com/michaeljclark/busybear-linux.git +2. cd busybear-linux && git submodule init && git submodule update +3. cd src/riscv-pk && git checkout master +2. cd ../../ && CROSS_COMPILE=riscv{{bits}}-unknown-linux-gnu- make -j $(nproc) +``` -model| Jetson Nano \- Cortex\-A57(s) | Intel E5\-2650(s) | Jetson Nano \- GPU(128 CUDA Cores)(s) | 1080Ti(3584 CUDA Cores)(s) --|-|-|-|- -yolo_tfm | | | 1.076 | 0.043 -resnet50_mxg | 1.2076| 0.3807| 0.147 | 0.009 -resnet18_v1 | | | 0.055 | 0.004 -qd10_resnet20_v2 || | 0.064 | 0.010 -resnet50_v2 |1.4674| 0.5005 | 0.185 | 0.010 -qd10_resnet20_v2|0.2944|0.1605 | 0.065 | 0.012 -trec | 0.0075| 0.0028 | 0.002 | 0.001 -dcnet_mnist_v1|0.0062|0.0057 | 0.002 | 0.001 -mobilenetv1.0_imagenet|0.3508| 0.1483| 0.039 | 0.002 -resnet50_v1_imagenet|1.2453| 0.3429 | 0.150 | 0.009 -animal10 | 0.3055 | 0.1466 | 0.065 | 0.010 -vgg16_gcv|4.3787| 0.6092 | 0.713 | 0.021 -sentiment_trec|0.0047| 0.0022 | 0.002 | 0.001 -vgg19_gcv|5.1753| 0.7513 | 0.788 | 0.023 -squeezenet_gcv1.1|0.3889| 0.0895 | 0.044 | 0.002 -squeezenet_gcv1.0|0.1987| 0.1319 | 0.064 | 0.003 -shufflenet|1.4575| 0.7697 | 0.140 | 0.004 -ssd| | |0.773 | 0.030 -ssd_512_mobilenet1.0_coco_tfm| | | 0.311 | 0.016 -ssd_512_mobilenet1.0_voc_tfm| | | 0.220 | 0.014 +## Deploy CVM-Runtime to QEMU + +1. git clone git@github.com:CortexFoundation/cvm-runtime.git +2. cd cvm-runtime && git checkout riscv +3. cp cmake/config . +4. make lib && make test_model_riscv +5. cd ../riscv64-linux/busybear-linux +6. mkdir etc/tests +7. cp ../../cvm-runtime/build/libcvm.so ../../cvm-runtime/build/tests/test_model_riscv etc/tests/ +8. cp model data: cp -r /data/std_out/resnet50_v2 etc/tests/ etc/tests +9. modify the scripts/start-qemu.sh: +``` + 32 # construct command + 33 cmd="${QEMU_SYSTEM_BIN} -nographic -machine virt \ + 34 -kernel build/riscv-pk/bbl \ + 35 -m 2G \ + 36 -append \"root=/dev/vda ro console=ttyS0\" \ + 37 -drive file=busybear.bin,format=raw,id=hd0 \ + 38 -device virtio-blk-device,drive=hd0 \ + 39 -netdev ${QEMU_NETDEV},id=net0 \ + 40 -device virtio-ne +``` +9. make clean && make && ./scripts/start-qemu.sh +10. login as root, and password is busybear +11. cd /etc/tests +12. export LD_LIBRARY_PATH=/etc/tests +13. mkdir -p /data/std_out/ +14. mv /etc/tests/resnet50_v2 /data/std_out/ +15. cd /etc/tests && ./test_model_riscv +16. output: +``` +0 DDDDDD +load /data/std_out/resnet50_v2/symbol +load /data/std_out/resnet50_v2/params +ntpd: bad address '1.pool.ntp.org' +model loaded +GetOps: memory cost=711M percentage=0.0542804 ops=12396M percentage=0.94572 +ops 12500 +4 +1 3 224 224 +ntpd: bad address '0.pool.ntp.org' +output size = 1000 +9 11 -6 -4 -7 -5 -19 7 -5 -13 -15 6 -15 -17 -4 -21 -14 -17 -11 -18 -23 -26 -18 -6 -21 -8 -16 -10 -13 5 -16 -4 -1 1 1 1 5 8 -13 -12 -18 -5 -2 -10 -15 -12 -13 -13 -10 -1 +2 -22 20 4 -4 -16 0 -3 -9 -10 3 +7 4 1 -7 3 -4 0 -12 8 -9 9 9 -11 6 16 0 -4 -1 0 -11 -15 -5 0 -11 -13 -1 2 -11 7 -1 4 4 8 3 -10 8 -8 -6 12 4 4 0 12 0 2 0 -10 5 -3 -18 -11 -9 -10 -26 -8 -8 3 -10 5 9 +compare result: success +``` diff --git a/cmake/config.cmake b/cmake/config.cmake index 5e844e45..7494147c 100644 --- a/cmake/config.cmake +++ b/cmake/config.cmake @@ -6,4 +6,5 @@ set(ENABLE_FORMAL OFF) set(ENABLE_CUDA OFF) set(ENABLE_OPENCL OFF) -set(USE_NANO ON) +set(USE_RISCV ON) +set(USE_NANO OFF) diff --git a/src/runtime/graph_runtime.cc b/src/runtime/graph_runtime.cc index 78d1d504..6226bc44 100644 --- a/src/runtime/graph_runtime.cc +++ b/src/runtime/graph_runtime.cc @@ -24,7 +24,7 @@ //#define CUDA_PROFILE #ifdef PROFILE -#include +#include #ifdef CUDA_PROFILE #include #include @@ -59,7 +59,7 @@ CVM_REGISTER_OP(cvm_op) */ void CvmRuntime::Run() { #ifdef PROFILE - double start = omp_get_wtime(); + clock_t start = clock(); #endif // setup the array and requirements. for (size_t i = 0; i < op_execs_.size(); ++i) { @@ -69,8 +69,8 @@ void CvmRuntime::Run() { #ifdef CUDA_PROFILE cudaDeviceSynchronize(); #endif - double end = omp_get_wtime(); - double total = end - start; + clock_t end = clock(); + double total = (double)(end - start) / CLOCKS_PER_SEC; std::vector> vec_times(times.begin(), times.end()); std::stable_sort(vec_times.begin(), vec_times.end(), [](const std::pair& a, const std::pair& b) ->bool { @@ -662,7 +662,7 @@ std::function CvmRuntime::CreateCVMOp( ](){ #ifdef PROFILE if(times.find(op) == times.end()) times[op] = 0; - double start = omp_get_wtime(); + clock_t start = clock(); #endif CVMRetValue rv; CVMArgs targs( @@ -677,8 +677,8 @@ std::function CvmRuntime::CreateCVMOp( #ifdef CUDA_PROFILE //cudaDeviceSynchronize(); #endif - double end = omp_get_wtime(); - times[op] += end-start; + clock_t end = clock(); + times[op] += (double)(end-start) / CLOCKS_PER_SEC; #endif }; diff --git a/tests/Makefile b/tests/Makefile index c23b5b80..834bc5e0 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,17 +1,18 @@ all: test_model_cpu test_model_gpu test_model_formal test_op +GPP=riscv64-unknown-linux-gnu-g++ test_model_cpu: test_model.cc - g++ -o test_model_cpu test_model.cc -I../include -L../build/cpu/ -lcvm_runtime_cpu --std=c++11 -pthread -fopenmp -I../ -ldl -g -DUSE_GPU=0 -DCVM_PROFILING -fsigned-char + ${GPP} -o test_model_cpu test_model.cc -I../include -L../build/cpu/ -lcvm_runtime_cpu --std=c++11 -I../ -ldl -g -DUSE_GPU=0 -DCVM_PROFILING -fsigned-char test_model_formal: test_model.cc - g++ -o test_model_formal test_model.cc -I../include -L../build/formal/ -lcvm_runtime_formal --std=c++11 -pthread -fopenmp -I../ -ldl -g -DUSE_GPU=0 -fsigned-char + ${GPP} -o test_model_formal test_model.cc -I../include -L../build/formal/ -lcvm_runtime_formal --std=c++11 -I../ -ldl -g -DUSE_GPU=0 -fsigned-char test_model_gpu: test_model.cc - g++ -o test_model_gpu test_model.cc -I../include -L../build/cpu/ -L../build/gpu/ -lcvm_runtime_cuda -lcudart -lcuda --std=c++11 -pthread -fopenmp -I./ -ldl -g -DUSE_GPU=1 -DCVM_PROFILING -fsigned-char + ${GPP} -o test_model_gpu test_model.cc -I../include -L../build/cpu/ -L../build/gpu/ -lcvm_runtime_cuda -lcudart -lcuda --std=c++11 -I./ -ldl -g -DUSE_GPU=1 -DCVM_PROFILING -fsigned-char test_op: - g++ -o test_op test_op.cc -I../include -L../build/gpu -lcvm_runtime_cuda -lcuda -lcudart --std=c++11 -pthread -fopenmp -I../ -ldl -DCVM_PROFILING -fsigned-char -DUSE_GPU + ${GPP} -o test_op test_op.cc -I../include -L../build/gpu -lcvm_runtime_cuda -lcuda -lcudart --std=c++11 -I../ -ldl -DCVM_PROFILING -fsigned-char -DUSE_GPU clean: rm -f test_model_cpu test_model_formal test_model_gpu test_op diff --git a/tests/test_model.cc b/tests/test_model.cc index 978f5431..023a9cca 100644 --- a/tests/test_model.cc +++ b/tests/test_model.cc @@ -252,53 +252,54 @@ void test_thread() { int test_models(int device_type = 0) { std::cout << device_type << " DDDDDD" << std::endl; auto model_roots = { - "/data/std_out/yolo_tfm", - "/data/std_out/null", - "/data/std_out/resnet50_mxg", - "/data/std_out/ssd_512_mobilenet1.0_voc_tfm", - "/data/std_out/resnet18_v1_tfm", +// "/data/std_out/cvm_mnist" +// "/data/std_out/yolo_tfm", +// "/data/std_out/null", +// "/data/std_out/resnet50_mxg", +// "/data/std_out/ssd_512_mobilenet1.0_voc_tfm", +// "/data/std_out/resnet18_v1_tfm", "/data/std_out/resnet50_v2", - "/data/std_out/qd10_resnet20_v2", - "/data/std_out/trec", - // "/data/new_cvm/yolo3_darknet53_voc/data", - "/data/lz_model_storage/dcnet_mnist_v1/data", - "/data/lz_model_storage/mobilenetv1.0_imagenet/data", - "/data/lz_model_storage/resnet50_v1_imagenet/data", - "/data/lz_model_storage/animal10/data", - "/data/lz_model_storage/resnet50_v2/data", - "/data/lz_model_storage/vgg16_gcv/data", - "/data/lz_model_storage/sentiment_trec/data", - "/data/lz_model_storage/vgg19_gcv/data", - "/data/lz_model_storage/squeezenet_gcv1.1/data", - "/data/lz_model_storage/squeezenet_gcv1.0/data", - // invalid has strange attribute in operator elemwise_add. - // "/data/lz_model_storage/octconv_resnet26_0.250/data", - "/data/std_out/resnet50_mxg/", - "/data/std_out/resnet50_v2", - "/data/std_out/qd10_resnet20_v2", - "/data/std_out/random_3_0/", - "/data/std_out/random_3_1/", - "/data/std_out/random_3_2/", - "/data/std_out/random_3_3/", - "/data/std_out/random_3_4/", - "/data/std_out/random_3_5/", - "/data/std_out/random_4_0/", - "/data/std_out/random_4_1/", - // "/data/std_out/random_4_2/", - // "/data/std_out/random_4_3/", - // "/data/std_out/random_4_4/", - "/data/std_out/random_4_5/", - "/data/std_out/random_4_6/", - "/data/std_out/random_4_7/", - "/data/std_out/random_4_8/", - "/data/std_out/random_4_9/", - "/data/std_out/log2", - //"./tests/3145ad19228c1cd2d051314e72f26c1ce77b7f02/", - "/data/std_out/lr_attr", - // "/data/std_out/non_in", - "/data/std_out/shufflenet", - "/data/std_out/ssd", - "/data/std_out/ssd_512_mobilenet1.0_coco_tfm/", +// "/data/std_out/qd10_resnet20_v2", +// "/data/std_out/trec", +// // "/data/new_cvm/yolo3_darknet53_voc/data", +// "/data/lz_model_storage/dcnet_mnist_v1/data", +// "/data/lz_model_storage/mobilenetv1.0_imagenet/data", +// "/data/lz_model_storage/resnet50_v1_imagenet/data", +// "/data/lz_model_storage/animal10/data", +// "/data/lz_model_storage/resnet50_v2/data", +// "/data/lz_model_storage/vgg16_gcv/data", +// "/data/lz_model_storage/sentiment_trec/data", +// "/data/lz_model_storage/vgg19_gcv/data", +// "/data/lz_model_storage/squeezenet_gcv1.1/data", +// "/data/lz_model_storage/squeezenet_gcv1.0/data", +// // invalid has strange attribute in operator elemwise_add. +// // "/data/lz_model_storage/octconv_resnet26_0.250/data", +// "/data/std_out/resnet50_mxg/", +// "/data/std_out/resnet50_v2", +// "/data/std_out/qd10_resnet20_v2", +// "/data/std_out/random_3_0/", +// "/data/std_out/random_3_1/", +// "/data/std_out/random_3_2/", +// "/data/std_out/random_3_3/", +// "/data/std_out/random_3_4/", +// "/data/std_out/random_3_5/", +// "/data/std_out/random_4_0/", +// "/data/std_out/random_4_1/", +// // "/data/std_out/random_4_2/", +// // "/data/std_out/random_4_3/", +// // "/data/std_out/random_4_4/", +// "/data/std_out/random_4_5/", +// "/data/std_out/random_4_6/", +// "/data/std_out/random_4_7/", +// "/data/std_out/random_4_8/", +// "/data/std_out/random_4_9/", +// "/data/std_out/log2", +// //"./tests/3145ad19228c1cd2d051314e72f26c1ce77b7f02/", +// "/data/std_out/lr_attr", +// // "/data/std_out/non_in", +// "/data/std_out/shufflenet", +// "/data/std_out/ssd", +// "/data/std_out/ssd_512_mobilenet1.0_coco_tfm/", }; for (auto model_root : model_roots) { auto ret = run_LIF(model_root, device_type); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy