OneAPI

#!/bin/bash

USE_CUDA=false
WORK_SPACE=~/xyt/

install_packages() {
	echo -e "-------------------- Install packages --------------------"
	sudo apt-get install git
	sudo apt-get install cmake
	sudo apt-get install python3
	sudo apt-get install ninja-build
	pip install psutil
}

install_onemkl() {
	echo -e "-------------------- Install OneMKL --------------------"
	if [ -d ~/intel/oneapi/mkl/2021.3.0/ ]; then
		echo "OneMKL found"
		echo "~/intel/oneapi/mkl/2021.3.0/"
	else
		wget https://registrationcenter-download.intel.com/akdlm/irc_nas/17901/l_onemkl_p_2021.3.0.520_offline.sh
		sh l_onemkl_p_2021.3.0.520_offline.sh
		rm -rf l_onemkl_p_2021.3.0.520_offline.sh
	fi
}

install_dpcpp() {
	echo -e "-------------------- Install CLANG++ and DPCPP --------------------"
	export DPCPP_HOME=~/sycl_workspace/
	if [ -d $DPCPP_HOME ]; then
		echo "CLANG++ and DPCPP found"
		echo $DPCPP_HOME
	else
		mkdir $DPCPP_HOME
		cd $DPCPP_HOME
		git clone https://github.com.cnpmjs.org/intel/llvm -b sycl
		if [ $USE_CUDA ]; then
			python $DPCPP_HOME/llvm/buildbot/configure.py --cuda
		else
			python $DPCPP_HOME/llvm/buildbot/configure.py
		fi
		python $DPCPP_HOME/llvm/buildbot/configure.py
		python $DPCPP_HOME/llvm/buildbot/compile.py
		python $DPCPP_HOME/llvm/buildbot/check.py
	fi
}

create_env() {
	echo -e "-------------------- Create OneAPI env --------------------"
        export DPCPP_HOME=~/sycl_workspace/
	cd $WORK_SPACE
	rm -rf env_oneapi.sh
	echo "# TODO: configure DPCPP_ROOT/MKL_DPCPP_ROOT
export DPCPP_ROOT=${DPCPP_HOME}llvm/build
export MKL_DPCPP_ROOT=~/intel/oneapi/mkl/2021.3.0
export LD_LIBRARY_PATH=${DPCPP_ROOT}/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=${MKL_DPCPP_ROOT}/lib/ia32:${MKL_DPCPP_ROOT}/lib/intel64:${LD_LIBRARY_PATH}
export PATH=${DPCPP_ROOT}/bin:$PATH
export INTELOCLSDKROOT=${DPCPP_ROOT}
export SYCLROOT=${DPCPP_ROOT}" >> env_oneapi.sh
}

runtime_test() {
	echo -e "-------------------- Runtime test --------------------"
	cd $WORK_SPACE
	rm -rf simple-sycl-app.cpp
	rm -rf simple-sycl-app.exe
	source env_oneapi.sh
	echo "
#include <iostream>
#include <ctime>
#include <math.h>
#include <string>
#include <CL/sycl.hpp>
using namespace std;
using namespace sycl;
clock_t start;
const size_t len = 2048*2048*100;
void output_dev_info( const device& dev, const std::string& selector_name) {
	std::cout << selector_name << ": Selected device: " <<
	dev.get_info<info::device::name>() << "
";
	std::cout << " -> Device vendor: " <<
	dev.get_info<info::device::vendor>() << "
";
}
int main() {
	output_dev_info( device{ default_selector{}}, "default_selector" );
	output_dev_info( device{ host_selector{}}, "host_selector" );
	output_dev_info( device{ gpu_selector{}}, "gpu_selector" );
	
	float *a = new float[len]; memset(a, 123, len*sizeof(float));
	float *b = new float[len]; memset(b, 22, len*sizeof(float));
	float *c = new float[len];
	queue Q(gpu_selector{});
	float *a_dev = malloc_device<float>(len, Q);
	float *b_dev = malloc_device<float>(len, Q);
	float *c_dev = malloc_device<float>(len, Q);
		
	start=clock();
	for(int i=0;i<len;i++) c[i] = sqrt(a[i]) * b[i];
	long time_cpu = clock() - start;
	cout << time_cpu << std::endl;
	
	start=clock();
	Q.submit([&](handler &h) {
		h.parallel_for(len, [=](id<1> i) {
			c_dev[i] = sqrt(a_dev[i]) * b_dev[i];
		});
	}).wait();
	long time_xpu = clock() - start;
	cout << time_xpu << std::endl;
	cout << (float)time_cpu / time_xpu << std::endl;
	
	return 0;
}
" >> simple-sycl-app.cpp
	if [ $USE_CUDA ]; then
		clang++ -fsycl simple-sycl-app.cpp -o simple-sycl-app.exe
	else
		clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda-sycldevice simple-sycl-app.cpp -o simple-sycl-app.exe
	fi
	./simple-sycl-app.exe
}


install_packages
install_onemkl
install_dpcpp
create_env
runtime_test
原文地址:https://www.cnblogs.com/xytpai/p/15049823.html