From b5389d7fa97bbdc63cf2a8ffb0978b531ee0e498 Mon Sep 17 00:00:00 2001
From: Barney <barney@frontofficedeveloper.com>
Date: Thu, 3 Sep 2015 16:20:57 +0100
Subject: [PATCH] beta version of Device configuration changes and introduction
of KernelManager
---
com.amd.aparapi.jni/Aparapi.suo | Bin 20992 -> 22528 bytes
com.amd.aparapi.jni/Aparapi.vcxproj | 10 +-
com.amd.aparapi.jni/Aparapi.vcxproj.filters | 8 +-
com.amd.aparapi.jni/build.xml | 471 +++++++++-----
.../src/cpp/runKernel/Aparapi.cpp | 50 +-
.../internal/kernel/KernelDeviceProfile.java | 386 +++++------
.../internal/kernel/KernelManager.java | 600 +++++++++---------
.../internal/kernel/KernelManagers.java | 62 +-
.../internal/kernel/KernelProfile.java | 206 +++---
.../internal/kernel/ProfilingEvent.java | 16 +-
.../amd/aparapi/internal/util/Reflection.java | 36 +-
.../configuration/ConfigurationDemo.java | 164 ++---
.../CustomConfigurationDemo.java | 84 +--
.../configuration/KernelOkayInOpenCL.java | 42 +-
.../KernelWithAlternateFallbackAlgorithm.java | 48 +-
...rnelWithoutAlternateFallbackAlgorithm.java | 28 +-
.../LegacyConfigurationDemo.java | 52 +-
17 files changed, 1200 insertions(+), 1063 deletions(-)
diff --git a/com.amd.aparapi.jni/Aparapi.suo b/com.amd.aparapi.jni/Aparapi.suo
index 79b046879bc8389cd16d5fd8594758cf385c92b2..117d265b9625f6dc443e9f6dde562abcf51f7ded 100644
GIT binary patch
delta 2857
zcmb_eeN0nV6u%E%+gDnkr7d4Fq~$|ODHcUO2eeQGOA#8UZVA~$frz8fRWyRAjb@o9
zbAz63E=EU~Zp#ev)n&;(VyZLCOmu)-wq<b%E?H*$W4go`r;hHNwli5K88v$^zjx0)
z_nvdlJ@=e*pXW5^ndBzlj#B0_#`K7VKp>Du?UZ9P=jFTOn9FwdQ12`kjZAYf4Dgqv
zOoy}t0sf|3Z!8acM2#Y*AjaoS`QVS|;hxBBBvk|@4kRE{2sMIuiQ$&$w~$VS4soWQ
zdRf@pfyhCuK#*Zgh)IM2L37r_l=zV14ECB4EeHn!tdcFli%8HE7?Y%NJK>U~MB%u4
zP*uGkYo5+a{Q2082Y10Cn0#hIh~mjI+5_~(%nAkAi3>ACu}Ex%ep#cSK}ra-<?-PT
zHVimvk*`Ru;0&9vSIf#-D{E&RY&W)T%!P0V+b(8gPS(#lSub-#yvZmcX$GUQ%VYT<
z8TvRuX)?fMyxM1vOXoCQI6Z?EG7~F6wBiE2%n1kLpF{tu3Eo(<SJA*rNf({NGCT*x
zWdZjdATx=_X<(PKS)k3x!z@h_60{$BVpujB6U|P+OO+))PlAW@CYrtKi-H&j>4->)
zI2j3p2=1$GJVi$EjQcbmSqgS`MBxW{ZK?_wNOT>bC}FGuH8W;m+gKm#LWgW%S+YMZ
zhNI^jrhYs#qk3<1yq(2eO6`6q&1@bDymD{m!s$Aav$J2-*;gkrGwVP8<@&xATb)J3
zWhh_TslKpqA>DrZWc&EB^jl?%$Xgdt;K*QTN(5&F+YK2;4wsHZD#e>@73g#+(#dtA
zOe79Mf3i&)%pdY3@qKra<s3}Ms&Sbt$$GYzm9P@1PCd_QeB82{X!wFJ6zAjQYjM7T
zbQ{l8oRHsrcXZE)c}k|Bnm+wyuDTY(qmUJ`I&`>^72__~uvJJEvDG+2yi$A%aomXg
zVjNw~YFHVf4yiI2U9%B}?5V!-{1d!>e*{jdgrSyXECZB93t(9{2WhL?;kT8kUZW1f
z0=86DK|x(RY*{1L4@II^>1MlF4{O9^a%0=Uy5W413TABrrvh$SHF%P&;IGI7Me%Jg
zKkbK%!Wi(|l3{DZ#p#k#E`tid5Lz`%mQgXl_6@|FfA^m)wWra*1Tw}DXA$G!!JvS@
z)TOzCjIYDYS#0Ns9(Jgt-y`uus53HMZjJ(fjvC6>jpYt3J;F99@1F83T$xKz-6}br
z@{R6>BonS@sbHj1n>)C4HNi7b-kg)bHRn$`6YoEG*SWWDuMkw#R<#`bLLkkxZI8>{
zyJN7nytTb!cWaxg&E4keGCKP^d)+X(DjmkEinuW>0T$(B$2IO<J&hgio{sKTOGvh0
zo67}UO)fXOxD;xYLVcwk=Br{kDlm&^r`7prX8n&T5MP@J&s*d%<>+|2f2>Pc8-)_-
zRtr5^|4Jm%5Y{KzZdGFMqk5g;A4Hn&Ck*ttYK_Q>nY9mIHdLJQTRBBH2JOz^VCVxD
zv&p;GDp0k|CJ`(G(6{zmUiPR{KO)!qKS8BruXP$7riI&u`H)~s*AGOJJ<+wy4i1xw
zQ-jeqp&yJucB4^&i=T)<qSErOT*bS}@{jAU2D7;nU&`hJyc1mbhW-dx_)64HH(rbu
zvXDz2CFjV$LgF%l9&b#V%!=Z>gV&(}w0w#@k3}&|-~e4TBp~u45rBT3o-4))Pk~t>
z@Ki#BgRden;`^gn!s%b*BFL^qD$#toSo!G-+m8gs4<AzU_a~F2O&?e&=e*^-iMH2@
zzc722zD_cDbULmiXt!TcB)pF1j*{&UwK<?$s{^adB$`3S$>0Xd!V`Ic;@L<O$phrB
zkAf3QLla~?Pk&5wamc?z!jGT_9L8*{-3hAgY)W&t<wM8H%J!Qp#>R!;KZ~Ya7(-`7
z{~UJKK=l{56gs`fNlY~r|8HLHdB-_&?p*zmIF<Ix;lQRD^6GN^@kq|B{>dUzJaw;S
d*we7T;Yy|7a&%Zz4O30czWJ664(40h{{mFW1aklY
delta 1564
zcmah}|4&<06u-B9@Ab9xl>%Mcbz7+&o1MUDS>sqG<rSW^fJhtB_=7({DuyA0%9mu@
z5BjFj7_(&1qsy`=W?!-&44aHMqsGP6gdbco;}Z7|_#ez<KNyYRIgi%}Nf&SPx%YhU
zIp^N<^fj(u=WCa2;^x-Y*5>U(k(Y&OPrN(T_(}2?ZfCfT!CB$HlQ$x{2LYAgSXmL^
zv^XSkFA44rw}D<Sz@MVpUXKDZ6ow;@CWH?`o+J-gC(%<dAssw&aEIhD($6Adh+#w?
z(TX7J0^F89@V<=Ph$SH@XpS*?9tCeBVAZjopNIR7<K7QP3V$DZE3dx)&2M*(bzB~X
zf*dzgS+)rx8Db5v;CcvJEG{Z2I1gv)hU6$xvZZ!YX~fV1?o1j<x0l;>WX`p}2cIi4
z%qekfkbt4HRKMZ&ggLAn2qEL!fgp^@v9dQOv`{4cXWjsd-d|-2Sx;5uhsA~w*^jK-
z5-C9>stIuXlOCsw=`O}3_B}M`o`HJRZ>WtrFZ(uR?8H``<tXh%;v*OQ<r|dgI;g(w
zg7@fkA!Md(xS{M`QwCN-DM<NCO>vfCan{F9;NEZk`rt~o8B=c&3lYXv%&IR3S~yXG
za!`{6j6v5+u|=xQ24{kUPDYQ0awoa*B<SW49Z*3HRk+vS`+Dur7fVQOXb^TAXTyVn
z&_Krch>R!EQAwcWOxJ}Y4>-&Pa`3U%RX@!p7+tfq;ETY47l;nA9BRhdo4C)hh^7AT
z2(ee#EL%if5iKHE*-3`6;7Z+ILvMA7d=uVD{tk~5qxRzI5{##t;c90X@~X!<Tbh_D
zPEXC8gr9oac(vydm`n$&Hg?kfnCax-S~s#w%f~^{cIX_h&QHwEzmWwsp_h+FxeR<?
z55(KNu+*v<`J{`lAMfIk3z+>9Vi{3J0OC``XNZf$zuxuI{;!bu8nKGFiMWNJd04{}
zDqSVWo$xM?Rn}9gO`JrT1b?*t0Lz^nRGOK#Cllv)YNag~XHT7)ojE!QrQR6-u9gYh
z%_Je6QEGQ(cjp9&X-{uY&L5$HG*_hZF3tpf18O@|(}o_+54U>Vt~8p`3)KF%jx<F3
zeKxJ;CGJj_g8QE{^V!}Kc+l&v?Oc5UrrQFq`aQmP6X_0eds+iS*D4x^b83iO6}s^1
zx&;5cn3bK#9ztx7ZvP_zN8e(yU*cT0!_q($x}V>G%3&XjcCW&c;)Y5h0@JxLzkySF
y0UoCOur?sUBcWw|Xu~c$Fa&*H&5`{Xi3j*y8G_}}4h&c@&$ysm>#d*Z98)+O2K?
diff --git a/com.amd.aparapi.jni/Aparapi.vcxproj b/com.amd.aparapi.jni/Aparapi.vcxproj
index 3023d478..279e7ab8 100644
--- a/com.amd.aparapi.jni/Aparapi.vcxproj
+++ b/com.amd.aparapi.jni/Aparapi.vcxproj
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
@@ -18,12 +18,12 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v110</PlatformToolset>
+ <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v110</PlatformToolset>
+ <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -78,10 +78,10 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="src\cpp\aparapi.cpp" />
<ClCompile Include="src\cpp\clHelper.cpp" />
<ClCompile Include="src\cpp\jniHelper.cpp" />
- <ClCompile Include="src\cpp\opencljni.cpp" />
+ <ClCompile Include="src\cpp\runKernel\Aparapi.cpp" />
+ <ClCompile Include="src\cpp\runKernel\JNIContext.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\com_amd_aparapi_KernelRunner.h" />
diff --git a/com.amd.aparapi.jni/Aparapi.vcxproj.filters b/com.amd.aparapi.jni/Aparapi.vcxproj.filters
index 2de182d5..686086d6 100644
--- a/com.amd.aparapi.jni/Aparapi.vcxproj.filters
+++ b/com.amd.aparapi.jni/Aparapi.vcxproj.filters
@@ -15,16 +15,16 @@
</Filter>
</ItemGroup>
<ItemGroup>
- <ClCompile Include="src\cpp\aparapi.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
<ClCompile Include="src\cpp\jniHelper.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\cpp\clHelper.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="src\cpp\opencljni.cpp">
+ <ClCompile Include="src\cpp\runKernel\Aparapi.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="src\cpp\runKernel\JNIContext.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
diff --git a/com.amd.aparapi.jni/build.xml b/com.amd.aparapi.jni/build.xml
index 035bc928..de7ee800 100644
--- a/com.amd.aparapi.jni/build.xml
+++ b/com.amd.aparapi.jni/build.xml
@@ -14,26 +14,21 @@ First consider editing the properties in build.properties
<echo>OS Arch: ${os.arch}</echo>
<echo>Java Ver: ${java.version}</echo>
- <!-- Ideally this would be the latest version of Java but not everyone is going to have it installed -->
- <!-- Additionally we want to avoid "Class not found: javac1.8" errors from old Ant versions (i.e. Eclipse) -->
- <property name="build.compiler" value="javac1.7"/>
- <property name="ant.build.javac.source" value="1.7"/>
- <property name="ant.build.javac.target" value="1.7"/>
-
- <property name="amd.app.sdk.version" value="2.9-1"/>
-
+ <!--<property name="build.compiler" value="javac1.6"/>-->
+ <!-- <property name="ant.build.javac.source" value="1.6"/>-->
+ <!-- <property name="ant.build.javac.target" value="1.6"/> -->
+
<property environment="env" />
-
- <!-- Check for AMD APP SDK -->
- <echo>
- Note: Since AMD APP SDK 2.9 you can have multiple versions installed/co-exist on same machine,
- so AMD introduced a completely new naming convention for their installation directories
- For example C:/Program Files/AMD APP SDK/2.9-1
- </echo>
+ <property name="msvc.dir" value="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" />
+ <!-- we need env.PATH for msvc only -->
+
+ <!-- uncomment this if you want to use mingw! -->
+ <!--<property name="mingw.dir" value="c:\\MinGW"/>-->
<target name="init">
- <available property="win32.amd.app.sdk.exists" file="C:/Program Files/AMD APP SDK/${amd.app.sdk.version}" type="dir"/>
- <condition property="amd.app.sdk.dir" value="C:/Program Files/AMD APP SDK/${amd.app.sdk.version}">
+ <available property="win32.amd.app.sdk.exists" file="C:\Program Files (x86)\AMD APP SDK\2.9-1" type="dir"/>
+
+ <condition property="amd.app.sdk.dir" value="C:\Program Files (x86)\AMD APP SDK\2.9-1">
<and>
<os family="windows" />
<isset property="win32.amd.app.sdk.exists" />
@@ -43,8 +38,8 @@ First consider editing the properties in build.properties
</and>
</condition>
- <available property="win64.amd.app.sdk.exists" file="C:/Program Files (x86)/AMD APP SDK/${amd.app.sdk.version}" type="dir"/>
- <condition property="amd.app.sdk.dir" value="C:/Program Files (x86)/AMD APP SDK/${amd.app.sdk.version}">
+ <available property="win64.amd.app.sdk.exists" file="C:\Program Files (x86)\AMD APP SDK\2.9-1" type="dir"/>
+ <condition property="amd.app.sdk.dir" value="C:\Program Files (x86)\AMD APP SDK\2.9-1">
<and>
<os family="windows" />
<isset property="win64.amd.app.sdk.exists" />
@@ -54,8 +49,8 @@ First consider editing the properties in build.properties
</and>
</condition>
- <available property="linux.amd.app.sdk.exists" file="/opt/AMDAPPSDK-${amd.app.sdk.version}" type="dir"/>
- <condition property="amd.app.sdk.dir" value="/opt/AMDAPPSDK-${amd.app.sdk.version}">
+ <available property="linux.amd.app.sdk.exists" file="/opt/AMDAPP" type="dir"/>
+ <condition property="amd.app.sdk.dir" value="/opt/AMDAPP">
<and>
<os family="unix" />
<not>
@@ -71,191 +66,227 @@ First consider editing the properties in build.properties
</and>
</condition>
- <echo message="amd.app.sdk.dir ${amd.app.sdk.dir}"/>
+ <echo message=" amd.app.sdk.dir ${amd.app.sdk.dir}"/>
- <available property="linux.intel.app.sdk.exists" file="/opt/intel/opencl" type="dir"/>
- <condition property="intel.app.sdk.dir" value="/opt/intel/opencl">
+ <!-- Check for Visual Studio -->
+ <!-- This needs to be in descending order to properly handle multiple installations -->
+
+ <available property="msvc.32.11.0.exists" file="c:/Program Files (x86)/Microsoft Visual Studio 11.0\VC\bin" type="dir"/>
+ <condition property="msvc.dir" value="c:/Program Files (x86)/Microsoft Visual Studio 11.0">
<and>
- <os family="unix" />
<not>
- <os family="mac" />
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
</not>
- <isset property="linux.intel.app.sdk.exists" />
+ <os family="windows" />
+ <isset property="msvc.32.11.0.exists" />
<not>
- <isset property="win32.amd.app.sdk.exists" />
+ <isset property="msvc.dir" />
</not>
<not>
- <isset property="win64.amd.app.sdk.exists" />
+ <isset property="mingw.dir" />
</not>
</and>
</condition>
-
- <echo message=" intel.app.sdk.dir ${intel.app.sdk.dir}"/>
-
- <condition property="vendor.name" value="amd">
- <isset property="amd.app.sdk.dir" />
- </condition>
-
- <condition property="vendor.name" value="intel">
+
+ <available property="msvc.64.10.0.exists" file="c:/Program Files/Microsoft Visual Studio 10.0\vc\bin" type="dir"/>
+ <condition property="msvc.dir" value="c:/Program Files/Microsoft Visual Studio 10.0">
<and>
- <isset property="intel.app.sdk.dir" />
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
+ <os family="windows" />
+ <isset property="msvc.64.10.0.exists" />
<not>
- <isset property="amd.app.sdk.dir" />
+ <isset property="msvc.dir" />
</not>
- </and>
- </condition>
-
- <echo message=" vendor.name ${vendor.name}"/>
-
- <condition property="app.sdk.dir" value="${amd.app.sdk.dir}">
- <isset property="amd.app.sdk.dir" />
- </condition>
-
- <condition property="app.sdk.dir" value="${intel.app.sdk.dir}">
- <and>
- <isset property="intel.app.sdk.dir" />
<not>
- <isset property="app.sdk.dir" />
+ <isset property="mingw.dir" />
</not>
</and>
</condition>
-
- <echo message="app.sdk.dir ${app.sdk.dir}"/>
-
- <!-- Check for Visual Studio Compiler -->
- <!-- This needs to be in descending order to properly handle multiple installations -->
- <available property="msvc.32.12.0.exists" file="C:/Program Files/Microsoft Visual Studio 12.0\VC\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files/Microsoft Visual Studio 12.0">
+
+ <available property="msvc.32.10.0.exists" file="c:/Program Files (x86)/Microsoft Visual Studio 10.0\vc\bin" type="dir"/>
+ <condition property="msvc.dir" value="c:/Program Files (x86)/Microsoft Visual Studio 10.0">
<and>
- <os family="windows" />
- <isset property="msvc.32.12.0.exists" />
<not>
- <isset property="msvc.dir" />
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
</not>
- </and>
- </condition>
-
- <available property="msvc.64.12.0.exists" file="C:/Program Files (x86)/Microsoft Visual Studio 12.0\VC\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files (x86)/Microsoft Visual Studio 12.0">
- <and>
<os family="windows" />
- <isset property="msvc.64.12.0.exists" />
+ <isset property="msvc.32.10.0.exists" />
<not>
<isset property="msvc.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
- <available property="msvc.32.11.0.exists" file="C:/Program Files/Microsoft Visual Studio 11.0\VC\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files/Microsoft Visual Studio 11.0">
+ <available property="msvc.32.9.0.exists" file="c:/Program Files/Microsoft Visual Studio 9.0\vc\bin" type="dir"/>
+ <condition property="msvc.dir" value="c:/Program Files/Microsoft Visual Studio 9.0">
<and>
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
<os family="windows" />
- <isset property="msvc.32.11.0.exists" />
+ <isset property="msvc.32.9.0.exists" />
<not>
<isset property="msvc.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
-
- <available property="msvc.64.11.0.exists" file="C:/Program Files (x86)/Microsoft Visual Studio 11.0\VC\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files (x86)/Microsoft Visual Studio 11.0">
+
+ <!-- Check for SDKs -->
+ <!-- This needs to be in descending order to properly handle multiple installations -->
+
+ <!-- <available property="msvc.sdk.8.0A.32.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0A">
<and>
<os family="windows" />
- <isset property="msvc.64.11.0.exists" />
+ <isset property="msvc.sdk.8.0A.32.exists" />
<not>
- <isset property="msvc.dir" />
+ <isset property="msvc.sdk.dir" />
+ </not>
+ <not>
+ <isset property="mingw.dir" />
</not>
</and>
</condition>
- <available property="msvc.32.10.0.exists" file="c:/Program Files/Microsoft Visual Studio 10.0\vc\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files/Microsoft Visual Studio 10.0">
+ <available property="msvc.sdk.8.0.32.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0">
<and>
<os family="windows" />
- <isset property="msvc.32.10.0.exists" />
+ <isset property="msvc.sdk.8.0.32.exists" />
<not>
- <isset property="msvc.dir" />
+ <isset property="msvc.sdk.dir" />
+ </not>
+ <not>
+ <isset property="mingw.dir" />
</not>
</and>
- </condition>
+ </condition> -->
- <available property="msvc.64.10.0.exists" file="c:/Program Files (x86)/Microsoft Visual Studio 10.0\vc\bin" type="dir"/>
- <condition property="msvc.dir" value="c:/Program Files (x86)/Microsoft Visual Studio 10.0">
+ <available property="msvc.sdk.7.1A.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.1A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.1A">
<and>
<os family="windows" />
- <isset property="msvc.64.10.0.exists" />
+ <isset property="msvc.sdk.7.1A.exists" />
<not>
- <isset property="msvc.dir" />
+ <isset property="msvc.sdk.dir" />
+ </not>
+ <not>
+ <isset property="mingw.dir" />
</not>
</and>
</condition>
-
- <!-- Check for SDKs -->
- <!-- This needs to be in descending order to properly handle multiple installations -->
-
- <available property="msvc.sdk.7.1A.32.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.1A" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.1A">
+
+ <available property="msvc.sdk.7.1A.32.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A">
<and>
<os family="windows" />
<isset property="msvc.sdk.7.1A.32.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
- <available property="msvc.sdk.7.1A.64.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A">
+ <available property="msvc.sdk.7.1.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.1" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.1">
<and>
<os family="windows" />
- <isset property="msvc.sdk.7.1A.64.exists" />
+ <isset property="msvc.sdk.7.1.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
-
- <available property="msvc.sdk.7.1.32.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.1" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.1">
+
+ <available property="msvc.sdk.7.1.32.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1">
<and>
<os family="windows" />
<isset property="msvc.sdk.7.1.32.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
- <available property="msvc.sdk.7.1.64.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1">
+ <available property="msvc.sdk.7.0A.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.0A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.0A">
<and>
<os family="windows" />
- <isset property="msvc.sdk.7.1.64.exists" />
+ <isset property="msvc.sdk.7.0A.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
- <available property="msvc.sdk.7.0A.32.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.0A" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.0A">
+ <available property="msvc.sdk.7.0A.32.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A">
<and>
<os family="windows" />
<isset property="msvc.sdk.7.0A.32.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
+ </and>
+ </condition>
+
+ <available property="msvc.sdk.7.0.exists" file="C:/Program Files/Microsoft SDKs/Windows/v7.0" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v7.0">
+ <and>
+ <os family="windows" />
+ <isset property="msvc.sdk.7.0.exists" />
+ <not>
+ <isset property="msvc.sdk.dir" />
+ </not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
- <available property="msvc.sdk.7.0A.64.exists" file="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A" type="dir"/>
- <condition property="msvc.sdk.dir" value="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A">
+ <available property="msvc.sdk.6.0A.exists" file="C:/Program Files/Microsoft SDKs/Windows/v6.0A" type="dir"/>
+ <condition property="msvc.sdk.dir" value="C:/Program Files/Microsoft SDKs/Windows/v6.0A">
<and>
<os family="windows" />
- <isset property="msvc.sdk.7.0A.64.exists" />
+ <isset property="msvc.sdk.6.0A.exists" />
<not>
<isset property="msvc.sdk.dir" />
</not>
+ <not>
+ <isset property="mingw.dir" />
+ </not>
</and>
</condition>
@@ -264,6 +295,7 @@ First consider editing the properties in build.properties
</target>
<target name="check" depends="init">
+
<fail message="Error:">
<condition>
<and>
@@ -275,9 +307,9 @@ First consider editing the properties in build.properties
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
- At present msvc.dir seems to be configured but not msvc.sdk.dir
+ At present msvc.dir seems to be Configured but not msvc.sdk.dir
]]>
</fail>
@@ -292,12 +324,11 @@ First consider editing the properties in build.properties
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
- At present msvc.sdk.dir seems to be configured but not msvc.dir
+ At present msvc.sdk.dir seems to be Configured but not msvc.dir
]]>
</fail>
-
<available file="${msvc.dir}" type="dir" property="msvc.dir.exists" />
<available file="${msvc.sdk.dir}" type="dir" property="msvc.sdk.dir.exists" />
@@ -312,12 +343,11 @@ First consider editing the properties in build.properties
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
At present msvc.dir is set (to ${msvc.dir}) but that dir does not exist
]]>
</fail>
-
<fail message="Error:">
<condition>
<and>
@@ -329,12 +359,34 @@ First consider editing the properties in build.properties
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
At present msvc.sdk.dir is set (to ${msvc.sdk.dir}) but that dir does not exist
]]>
</fail>
-
+
+
+ <available file="${mingw.dir}" type="dir" property="mingw.dir.exists" />
+ <fail message="Error:">
+ <condition>
+ <and>
+ <os family="windows" />
+ <isset property="mingw.dir" />
+ <not>
+ <isset property="mingw.dir.exists" />
+ </not>
+ </and>
+ </condition>
+ <![CDATA[
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
+
+ At present mingw.dir is set (to ${mingw.dir}) but that dir does not exist
+ ]]>
+ </fail>
+ <echo message="java.home ${java.home}"/>
+ <!--<echo message="msvc.dir.exists ${msvc.dir.exists}"/>-->
+ <!--<echo message="msvc.sdk.dir.exists ${msvc.sdk.dir.exists}"/>-->
+ <!--<echo message="mingw.dir.exists ${mingw.dir.exists}"/>-->
<condition property="use.msvc">
<and>
<os family="windows" />
@@ -342,6 +394,54 @@ First consider editing the properties in build.properties
<isset property="msvc.sdk.dir.exists" />
</and>
</condition>
+ <!--<echo message="use.msvc ${use.msvc}"/>-->
+
+ <condition property="use.mingw">
+ <and>
+ <os family="windows" />
+ <isset property="mingw.dir.exists" />
+ </and>
+ </condition>
+ <!--<echo message="use.mingw ${use.mingw}"/>-->
+
+ <fail message="Error:">
+ <condition>
+ <and>
+ <isset property="use.mingw" />
+ <isset property="use.msvc" />
+ </and>
+ </condition>
+ <![CDATA[
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
+
+ At present ant is Configured for both MinGW AND Microsoft Visual Studio. You need to pick one or the other :) !
+
+ Just comment out the properties for the compiler that you *do not* wish to use.
+ ]]>
+ </fail>
+
+ <fail message="Error:">
+ <condition>
+ <and>
+ <os family="windows" />
+ <not>
+ <or>
+ <isset property="use.mingw" />
+ <isset property="use.msvc" />
+ </or>
+ </not>
+ </and>
+ </condition>
+ <![CDATA[
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
+
+ This looks like a windows machine so you probably need to Configure either:-
+
+ * msvc.dir and msvc.sdk.dir if you wish to use Microsoft Visual Studio compiler
+
+ * mingw.dir if you prefer if you prefer to use MinGW
+ ]]>
+ </fail>
<condition property="use.gcc">
<and>
@@ -364,25 +464,24 @@ First consider editing the properties in build.properties
</condition>
<condition property="optional.amd64.subdir" value="" else="amd64\">
- <equals arg1="${x86_or_x86_64}" arg2="x86"/>
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
</condition>
<condition property="optional.x64.subdir" value="" else="x64\">
- <equals arg1="${x86_or_x86_64}" arg2="x86"/>
+ <or>
+ <os arch="x86" />
+ <os arch="i386" />
+ </or>
</condition>
- <condition property="optional.app.sdk.lib.subdir" value="lib\" else="lib64\">
- <equals arg1="${x86_or_x86_64}" arg2="x86"/>
-
- </condition>
-
- <condition property="gcc.m.value" value="32" else="64">
- <equals arg1="${x86_or_x86_64}" arg2="x86"/>
- </condition>
-
- <available file="${msvc.dir}\vc\bin\${optional.amd64.subdir}cl.exe" type="file" property="cl.exists" />
+ <available file="${msvc.dir}\${optional.amd64.subdir}cl.exe" type="file" property="cl.exists" />
+ <echo message="${msvc.dir}\${optional.amd64.subdir}cl.exe"/>
+
<fail message="Error:">
<condition>
<and>
@@ -393,10 +492,12 @@ First consider editing the properties in build.properties
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
- Could not find vc\bin\${optional.amd64.subdir}cl under configured msvc.dir. Check if msvc.dir is pointing
- to a valid Visual Studio installation
+
+
+ Could not find vc\bin\${optional.amd64.subdir}cl under Configured msvc.dir. Check if msvc.dir is pointing
+ to a valid visual studio installation
]]>
</fail>
@@ -407,18 +508,17 @@ First consider editing the properties in build.properties
<os family="mac" />
</not>
<not>
- <isset property="app.sdk.dir" />
+ <isset property="amd.app.sdk.dir" />
</not>
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
- You need to set app.sdk.dir to point to the location where OpenCL SDK is installed
+ You need to set amd.app.sdk.dir to point to the location where AMD APP SDK is installed
]]>
</fail>
-
- <available file="${app.sdk.dir}" type="dir" property="app.sdk.dir.exists" />
+ <available file="${amd.app.sdk.dir}" type="dir" property="amd.app.sdk.dir.exists" />
<fail message="Error:">
<condition>
@@ -427,14 +527,14 @@ First consider editing the properties in build.properties
<os family="mac" />
</not>
<not>
- <isset property="app.sdk.dir.exists" />
+ <isset property="amd.app.sdk.dir.exists" />
</not>
</and>
</condition>
<![CDATA[
- You will need to edit com.amd.aparapi.jni/build.xml to compile aparapi JNI code
+ You will need to edit com.amd.aparapi.jni/build.properties to compile aparapi JNI code
- At present app.sdk.dir is set (to ${app.sdk.dir}) but that dir does not exist
+ At present amd.app.sdk.dir is set (to ${amd.app.sdk.dir}) but that dir does not exist
]]>
</fail>
</target>
@@ -501,11 +601,11 @@ First consider editing the properties in build.properties
</javah>
</target>
+
<target name="gcc" if="use.gcc">
<mkdir dir="${basedir}/dist"/>
<echo message="linuxcc ${os.arch}" />
- <exec executable="g++" failonerror="true">
- <arg value="-m${gcc.m.value}" />
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
@@ -513,7 +613,7 @@ First consider editing the properties in build.properties
<arg value="-I${java.home}/../include" />
<arg value="-I${java.home}/../include/linux" />
<arg value="-Iinclude" />
- <arg value="-I${app.sdk.dir}/include" />
+ <arg value="-I${amd.app.sdk.dir}/include" />
<arg value="-Isrc/cpp" />
<arg value="-Isrc/cpp/runKernel" />
<arg value="-Isrc/cpp/invoke" />
@@ -535,8 +635,7 @@ First consider editing the properties in build.properties
<arg value="src/cpp/classtools.cpp" />
<arg value="src/cpp/JNIHelper.cpp" />
<arg value="src/cpp/agent.cpp" />
- <arg value="-L${app.sdk.dir}/lib/${x86_or_x86_64}" />
- <arg value="-L${app.sdk.dir}/${optional.app.sdk.lib.subdir}" />
+ <arg value="-L${amd.app.sdk.dir}/lib/${x86_or_x86_64}" />
<arg value="-lOpenCL" />
</exec>
</target>
@@ -544,7 +643,7 @@ First consider editing the properties in build.properties
<target name="gcc_mac" if="use.gcc_mac">
<mkdir dir="${basedir}/dist"/>
<echo message="gcc ${os.arch}" />
- <exec executable="g++" failonerror="true">
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
@@ -552,9 +651,9 @@ First consider editing the properties in build.properties
<arg value="-DCL_USE_DEPRECATED_OPENCL_1_1_APIS"/>
<!-- JDK 6 -->
<arg value="-I/System/Library/Frameworks/JavaVM.framework/Headers" />
- <!-- LATEST JDK 7 without JDK 6 -->
- <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/include/" />
- <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/include/darwin/" />
+ <!-- JDK 7u51 without JDK 6 -->
+ <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home/include/" />
+ <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_12.jdk/Contents/Home/include/darwin/" />
<arg value="-Iinclude" />
<arg value="-Isrc/cpp" />
<arg value="-Isrc/cpp/runKernel" />
@@ -586,7 +685,7 @@ First consider editing the properties in build.properties
<target name="msvc" if="use.msvc">
<mkdir dir="${basedir}\dist"/>
<echo message="msvc ${os.arch}" />
- <exec executable="${msvc.dir}\vc\bin\${optional.amd64.subdir}cl.exe" failonerror="true">
+ <exec executable="${msvc.dir}\${optional.amd64.subdir}cl.exe">
<env key="PATH" path="${env.PATH};${msvc.dir}\\Common7\\IDE" />
<arg value="/nologo" />
<arg value="/TP" />
@@ -599,9 +698,10 @@ First consider editing the properties in build.properties
<arg value="/I${java.home}\..\include" />
<arg value="/I${java.home}\..\include\win32" />
<arg value="/Iinclude" />
- <arg value="/I${app.sdk.dir}\include" />
+ <arg value="/I${amd.app.sdk.dir}\include" />
<arg value="/IC:\Program Files (x86)\Windows Kits\8.0\Include\shared" />
<arg value="/IC:\Program Files (x86)\Windows Kits\8.0\Include\um" />
+
<arg value="/Isrc/cpp" />
<arg value="/Isrc/cpp/runKernel" />
<arg value="/Isrc/cpp/invoke" />
@@ -624,20 +724,58 @@ First consider editing the properties in build.properties
<arg value="/link" />
<arg value="/libpath:${msvc.dir}\vc\lib\${optional.amd64.subdir}" />
<arg value="/libpath:${msvc.sdk.dir}\lib\${optional.x64.subdir}" />
- <arg value="/libpath:${app.sdk.dir}\lib\${x86_or_x86_64}" />
- <arg value="/libpath:${app.sdk.dir}\${optional.app.sdk.lib.subdir}" />
+ <arg value="/libpath:${amd.app.sdk.dir}\lib\${x86_or_x86_64}" />
<arg value="/libpath:C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64" />
- <arg value="OpenCL.lib" />
+ <arg value="C:\Program Files (x86)\AMD APP SDK\2.9-1\lib\x86\OpenCL.lib" />
<arg value="/out:${basedir}\dist\aparapi_${x86_or_x86_64}.dll" />
</exec>
</target>
- <target name="build" depends="clean, javah, msvc, gcc, gcc_mac" />
+ <target name="mingw" if="use.mingw">
+ <mkdir dir="${basedir}\dist"/>
+ <echo message="mingw ${os.arch}" />
+ <exec executable="${mingw.dir}/bin/g++">
+ <env key="PATH" path="${env.PATH};${mingw.dir}/bin" />
+ <arg value="-Wall" />
+ <arg value="-O3" />
+ <arg value="-Wl,--kill-at" />
+ <arg value="-DCL_USE_DEPRECATED_OPENCL_1_1_APIS"/>
+ <arg value="-I${java.home}\..\include" />
+ <arg value="-I${java.home}\..\include\win32" />
+ <arg value="-Iinclude" />
+ <arg value="-I${amd.app.sdk.dir}\include" />
+ <arg value="-Isrc/cpp" />
+ <arg value="-Isrc/cpp/runKernel" />
+ <arg value="-Isrc/cpp/invoke" />
+ <arg value="-shared" />
+ <arg value="-o" />
+ <arg value="${basedir}\dist\aparapi_${x86_or_x86_64}.dll" />
+ <arg value="src/cpp/runKernel/Aparapi.cpp" />
+ <arg value="src/cpp/runKernel/ArrayBuffer.cpp" />
+ <arg value="src/cpp/runKernel/AparapiBuffer.cpp" />
+ <arg value="src/cpp/runKernel/Config.cpp" />
+ <arg value="src/cpp/runKernel/JNIContext.cpp" />
+ <arg value="src/cpp/runKernel/KernelArg.cpp" />
+ <arg value="src/cpp/runKernel/ProfileInfo.cpp" />
+ <arg value="src/cpp/runKernel/Range.cpp" />
+ <arg value="src/cpp/invoke/OpenCLJNI.cpp" />
+ <arg value="src/cpp/invoke/OpenCLArgDescriptor.cpp" />
+ <arg value="src/cpp/invoke/OpenCLMem.cpp" />
+ <arg value="src/cpp/CLHelper.cpp" />
+ <arg value="src/cpp/classtools.cpp" />
+ <arg value="src/cpp/JNIHelper.cpp" />
+ <arg value="src/cpp/agent.cpp" />
+ <arg value="-L${amd.app.sdk.dir}\lib\${x86_or_x86_64}" />
+ <arg value="-lOpenCL" />
+ </exec>
+ </target>
+
+ <target name="build" depends="clean, javah, msvc, mingw, gcc, gcc_mac" />
<target name="msvc_cltest" if="use.msvc">
<mkdir dir="${basedir}\dist"/>
<echo message="msvc_cltest ${os.arch}" />
- <exec executable="${msvc.dir}\vc\bin\${optional.amd64.subdir}cl.exe" failonerror="true">
+ <exec executable="${msvc.dir}\vc\bin\${optional.amd64.subdir}cl.exe">
<env key="PATH" path="${env.PATH};${msvc.dir}\\Common7\\IDE" />
<arg value="/nologo" />
<arg value="/TP" />
@@ -645,7 +783,7 @@ First consider editing the properties in build.properties
<arg value="-DCL_USE_DEPRECATED_OPENCL_1_1_APIS"/>
<arg value="/I${msvc.dir}\vc\include" />
<arg value="/I${msvc.sdk.dir}\include" />
- <arg value="/I${app.sdk.dir}\include" />
+ <arg value="/I${amd.app.sdk.dir}\include" />
<arg value="/Isrc/cpp" />
<arg value="/Isrc/cpp/runKernel" />
<arg value="/Isrc/cpp/invoke" />
@@ -653,8 +791,7 @@ First consider editing the properties in build.properties
<arg value="/link" />
<arg value="/libpath:${msvc.dir}\vc\lib\${optional.amd64.subdir}" />
<arg value="/libpath:${msvc.sdk.dir}\lib\${optional.x64.subdir}" />
- <arg value="/libpath:${app.sdk.dir}\lib\${x86_or_x86_64}" />
- <arg value="/libpath:${app.sdk.dir}\${optional.app.sdk.lib.subdir}" />
+ <arg value="/libpath:${amd.app.sdk.dir}\lib\${x86_or_x86_64}" />
<arg value="OpenCL.lib" />
<arg value="/out:${basedir}/dist/cltest_${x86_or_x86_64}.exe" />
</exec>
@@ -663,16 +800,16 @@ First consider editing the properties in build.properties
<target name="mac_cltest" if="use.gcc_mac">
<mkdir dir="${basedir}/dist"/>
<echo message="gcc cltest ${os.arch}" />
- <exec executable="g++" failonerror="true">
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
<arg value="-DCL_USE_DEPRECATED_OPENCL_1_1_APIS"/>
<!-- JDK 6 -->
<arg value="-I/System/Library/Frameworks/JavaVM.framework/Headers" />
- <!-- Latest JDK 7 without JDK 6 -->
- <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/include/" />
- <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/include/darwin/" />
+ <!-- JDK 7u51 without JDK 6 -->
+ <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/include/" />
+ <arg value="-I/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/include/darwin/" />
<arg value="-Iinclude" />
<arg value="-Isrc/cpp" />
<arg value="-Isrc/cpp/runKernel" />
@@ -688,17 +825,16 @@ First consider editing the properties in build.properties
<target name="gcc_cltest" if="use.gcc">
<mkdir dir="${basedir}/dist"/>
<echo message="gcc cltest ${os.arch}" />
- <exec executable="g++" failonerror="true">
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
<arg value="-DCL_USE_DEPRECATED_OPENCL_1_1_APIS"/>
<arg value="-I${java.home}/../include" />
<arg value="-I${java.home}/../include/linux" />
- <arg value="-I${app.sdk.dir}/include" />
+ <arg value="-I${amd.app.sdk.dir}/include" />
<arg value="src/cpp/cltest.cpp" />
- <arg value="-L${app.sdk.dir}/lib/${x86_or_x86_64}" />
- <arg value="-L${app.sdk.dir}/${optional.app.sdk.lib.subdir}" />
+ <arg value="-L${amd.app.sdk.dir}/lib/${x86_or_x86_64}" />
<arg value="-lOpenCL" />
<arg value="-o" />
<arg value="${basedir}/cltest_${x86_or_x86_64}" />
@@ -708,7 +844,7 @@ First consider editing the properties in build.properties
<target name="gcc_clt" if="use.gcc">
<mkdir dir="${basedir}/dist"/>
<echo message="gcc cltest ${os.arch}" />
- <exec executable="g++" failonerror="true">
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
@@ -719,10 +855,11 @@ First consider editing the properties in build.properties
</exec>
</target>
+
<target name="mac_clt" if="use.gcc_mac">
<mkdir dir="${basedir}/dist"/>
<echo message="gcc clt ${os.arch}" />
- <exec executable="g++" failonerror="true">
+ <exec executable="g++">
<arg value="-O3" />
<arg value="-g" />
<arg value="-fPIC" />
diff --git a/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp b/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
index cbad7e81..d9c96970 100644
--- a/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
+++ b/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp
@@ -52,7 +52,7 @@
static const int PASS_ID_PREPARING_EXECUTION = -2;
static const int PASS_ID_COMPLETED_EXECUTION = -1;
-static const int CANCEL_STATUS_FALSE = 0;
+static const int CANCEL_STATUS_FALSE = 0;
static const int CANCEL_STATUS_TRUE = 1;
//compiler dependant code
@@ -141,10 +141,10 @@ jint writeProfileInfo(JNIContext* jniContext){
fprintf(jniContext->profileFile, "%d write %s,", pos++, arg->name);
fprintf(jniContext->profileFile, "%lu,%lu,%lu,%lu,",
- (unsigned long)(arg->arrayBuffer->write.queued - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->write.submit - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->write.start - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->write.end - currSampleBaseTime)/1000);
+ (unsigned long)(arg->arrayBuffer->write.queued - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->write.submit - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->write.start - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->write.end - currSampleBaseTime)/1000);
}
}
@@ -181,10 +181,10 @@ jint writeProfileInfo(JNIContext* jniContext){
fprintf(jniContext->profileFile, "%d read %s,", pos++, arg->name);
fprintf(jniContext->profileFile, "%lu,%lu,%lu,%lu,",
- (unsigned long)(arg->arrayBuffer->read.queued - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->read.submit - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->read.start - currSampleBaseTime)/1000,
- (unsigned long)(arg->arrayBuffer->read.end - currSampleBaseTime)/1000);
+ (unsigned long)(arg->arrayBuffer->read.queued - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->read.submit - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->read.start - currSampleBaseTime)/1000,
+ (unsigned long)(arg->arrayBuffer->read.end - currSampleBaseTime)/1000);
}
}
}
@@ -789,15 +789,15 @@ void enqueueKernel(JNIContext* jniContext, Range& range, int passes, int argPos,
cl_int status = CL_SUCCESS;
for (int passid=0; passid < passes; passid++) {
-
- int cancelCode = kernelInBytesAsInts[0];
- kernelOutBytesAsInts[0] = passid;
+
+ int cancelCode = kernelInBytesAsInts[0];
+ kernelOutBytesAsInts[0] = passid;
- if (cancelCode == CANCEL_STATUS_TRUE) {
- fprintf(stderr, "received cancellation, aborting at pass %d\n", passid);
- kernelOutBytes[0] = -1;
- break;
- }
+ if (cancelCode == CANCEL_STATUS_TRUE) {
+ fprintf(stderr, "received cancellation, aborting at pass %d\n", passid);
+ kernelOutBytes[0] = -1;
+ break;
+ }
//size_t offset = 1; // (size_t)((range.globalDims[0]/jniContext->deviceIdc)*dev);
status = clSetKernelArg(jniContext->kernel, argPos, sizeof(passid), &(passid));
@@ -1079,16 +1079,16 @@ JNI_JAVA(jint, KernelRunnerJNI, runKernelJNI)
cl_int status = CL_SUCCESS;
JNIContext* jniContext = JNIContext::getJNIContext(jniContextHandle);
- jniContext->runKernelInBytes = (jbyte*)jenv->GetDirectBufferAddress(inBuffer);
- jniContext->runKernelOutBytes = (jbyte*)jenv->GetDirectBufferAddress(outBuffer);
+ jniContext->runKernelInBytes = (jbyte*)jenv->GetDirectBufferAddress(inBuffer);
+ jniContext->runKernelOutBytes = (jbyte*)jenv->GetDirectBufferAddress(outBuffer);
- jbyte* kernelInBytes = jniContext->runKernelInBytes;
- int* kernelInBytesAsInts = reinterpret_cast<int*>(kernelInBytes);
- kernelInBytesAsInts[0] = CANCEL_STATUS_FALSE;
+ jbyte* kernelInBytes = jniContext->runKernelInBytes;
+ int* kernelInBytesAsInts = reinterpret_cast<int*>(kernelInBytes);
+ kernelInBytesAsInts[0] = CANCEL_STATUS_FALSE;
- jbyte* kernelOutBytes = jniContext->runKernelOutBytes;
- int* kernelOutBytesAsInts = reinterpret_cast<int*>(kernelOutBytes);
- kernelOutBytesAsInts[0] = PASS_ID_PREPARING_EXECUTION;
+ jbyte* kernelOutBytes = jniContext->runKernelOutBytes;
+ int* kernelOutBytesAsInts = reinterpret_cast<int*>(kernelOutBytes);
+ kernelOutBytesAsInts[0] = PASS_ID_PREPARING_EXECUTION;
if (jniContext->firstRun && config->isProfilingEnabled()){
try {
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelDeviceProfile.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelDeviceProfile.java
index 87e221ef..577c13d9 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelDeviceProfile.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelDeviceProfile.java
@@ -1,193 +1,193 @@
-package com.amd.aparapi.internal.kernel;
-
-import com.amd.aparapi.*;
-import com.amd.aparapi.device.*;
-
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-
-/**
- * Created by Barney on 02/09/2015.
- */
-public class KernelDeviceProfile {
-
- private static Logger logger = Logger.getLogger(Config.getLoggerName());
- private static final double MILLION = 1000 * 1000;
- private static final int TABLE_COLUMN_HEADER_WIDTH = 21;
- private static final int TABLE_COLUMN_COUNT_WIDTH = 8;
- private static final int TABLE_COLUMN_WIDTH;
- private final Class<? extends Kernel> kernel;
- private final Device device;
- private long[] currentTimes = new long[ProfilingEvent.values().length];
- private long[] accumulatedTimes = new long[ProfilingEvent.values().length];
- private ProfilingEvent lastEvent = null;
- private final DecimalFormat format;
- private long invocationCount = 0;
-
- static {
- assert ProfilingEvent.START.ordinal() == 0 : "ProfilingEvent.START.ordinal() != 0";
- int max = 0;
- for (ProfilingEvent event : ProfilingEvent.values()) {
- max = Math.max(max, event.name().length());
- }
- TABLE_COLUMN_WIDTH = max + 1;
- }
-
- public KernelDeviceProfile(Class<? extends Kernel> kernel, Device device) {
- this.kernel = kernel;
- this.device = device;
- this.format = (DecimalFormat) DecimalFormat.getNumberInstance();
- format.setMinimumFractionDigits(3);
- format.setMaximumFractionDigits(3);
- }
-
- public void onEvent(ProfilingEvent event) {
- if (event == ProfilingEvent.START) {
- if (lastEvent != null) {
- logger.log(Level.SEVERE, "ProfilingEvent.START encountered without ProfilingEvent.EXECUTED");
- } else if (lastEvent == ProfilingEvent.START) {
- logger.log(Level.SEVERE, "Duplicate event ProfilingEvent.START");
- }
- Arrays.fill(currentTimes, 0L);
- ++invocationCount;
- } else {
- if (lastEvent == null) {
- if (event != ProfilingEvent.EXECUTED) {
- logger.log(Level.SEVERE, "ProfilingEvent.START was not invoked prior to ProfilingEvent." + event);
- }
- } else {
- for (int i = lastEvent.ordinal() + 1; i < event.ordinal(); ++i) {
- currentTimes[i] = currentTimes[i - 1];
- }
- }
- }
- currentTimes[event.ordinal()] = System.nanoTime();
- if (event == ProfilingEvent.EXECUTED) {
- for (int i = 1; i < currentTimes.length; ++i) {
- long elapsed = currentTimes[i] - currentTimes[i - 1];
- if (elapsed < 0) {
- logger.log(Level.SEVERE, "negative elapsed time for event " + event);
- break;
- }
- accumulatedTimes[i] += elapsed;
- }
- }
- lastEvent = event;
- if (event == ProfilingEvent.EXECUTED) {
- lastEvent = null;
- }
- }
-
- /** Elapsed time for a single event only, i.e. since the previous stage rather than from the start. */
- public double getLastElapsedTime(ProfilingEvent stage) {
- if (stage == ProfilingEvent.START) {
- return 0;
- }
- return (currentTimes[stage.ordinal()] - currentTimes[stage.ordinal() - 1]) / MILLION;
- }
-
- /** Elapsed time for all events {@code from} through {@code to}.*/
- public double getLastElapsedTime(ProfilingEvent from, ProfilingEvent to) {
- return (currentTimes[to.ordinal()] - currentTimes[from.ordinal()]) / MILLION;
- }
-
- /** Elapsed time for a single event only, i.e. since the previous stage rather than from the start, summed over all executions. */
- public double getCumulativeElapsedTime(ProfilingEvent stage) {
- return (accumulatedTimes[stage.ordinal()]) / MILLION;
- }
-
- /** Elapsed time of entire execution, summed over all executions. */
- public double getCumulativeElapsedTimeAll() {
- double sum = 0;
- for (int i = 1; i <= ProfilingEvent.EXECUTED.ordinal(); ++i) {
- sum += accumulatedTimes[i];
- }
- return sum;
- }
-
- public static String getTableHeader() {
- int length = ProfilingEvent.values().length;
- StringBuilder builder = new StringBuilder(150);
- appendRowHeaders(builder, "Device", "Count");
- for (int i = 1; i < length; ++i) {
- ProfilingEvent stage = ProfilingEvent.values()[i];
- String heading = stage.name();
- appendCell(builder, heading);
- }
- builder.append(" ").append("Total");
- return builder.toString();
- }
-
- public String getLastAsTableRow() {
- double total = 0;
- StringBuilder builder = new StringBuilder(150);
- appendRowHeaders(builder, device.getShortDescription(), String.valueOf(invocationCount));
- for (int i = 1; i < currentTimes.length; ++i) {
- ProfilingEvent stage = ProfilingEvent.values()[i];
- double time = getLastElapsedTime(stage);
- total += time;
- String formatted = format.format(time);
- appendCell(builder, formatted);
- }
- builder.append(" ").append(format.format(total));
- return builder.toString();
- }
-
- public String getCumulativeAsTableRow() {
- return internalCumulativeAsTableRow(false);
- }
-
- public String getAverageAsTableRow() {
- return internalCumulativeAsTableRow(true);
- }
-
- private String internalCumulativeAsTableRow(boolean mean) {
- double total = 0;
- double count = mean ? invocationCount : 1;
- StringBuilder builder = new StringBuilder(150);
- appendRowHeaders(builder, device.getShortDescription(), String.valueOf(invocationCount));
- for (int i = 1; i < currentTimes.length; ++i) {
- ProfilingEvent stage = ProfilingEvent.values()[i];
- double time = getCumulativeElapsedTime(stage);
- if (mean) {
- time /= count;
- }
- total += time;
- String formatted = format.format(time);
- appendCell(builder, formatted);
- }
- builder.append(" ").append(format.format(total));
- return builder.toString();
- }
-
- private static void appendRowHeaders(StringBuilder builder, String device, String count) {
- if (device.length() > TABLE_COLUMN_HEADER_WIDTH - 1) {
- device = device.substring(0, TABLE_COLUMN_HEADER_WIDTH - 1);
- }
- builder.append(device);
- int padding = TABLE_COLUMN_HEADER_WIDTH - device.length();
- for (int i = 0; i < padding; ++i) {
- builder.append(' ');
- }
-
- builder.append(count);
- padding = TABLE_COLUMN_COUNT_WIDTH - count.length();
- for (int i = 0; i < padding; ++i) {
- builder.append(' ');
- }
- }
-
- private static void appendCell(StringBuilder builder, String cell) {
- int padding = TABLE_COLUMN_WIDTH - cell.length();
- for (int paddingIndex = 0; paddingIndex < padding; ++paddingIndex) {
- builder.append(' ');
- }
- builder.append(cell);
- }
-
- @Override
- public String toString() {
- return "KernelDeviceProfile{" + kernel.toString() + ", " + device.getShortDescription() + "}";
- }
-}
+package com.amd.aparapi.internal.kernel;
+
+import com.amd.aparapi.*;
+import com.amd.aparapi.device.*;
+
+import java.text.*;
+import java.util.*;
+import java.util.logging.*;
+
+/**
+ * Created by Barney on 02/09/2015.
+ */
+public class KernelDeviceProfile {
+
+ private static Logger logger = Logger.getLogger(Config.getLoggerName());
+ private static final double MILLION = 1000 * 1000;
+ private static final int TABLE_COLUMN_HEADER_WIDTH = 21;
+ private static final int TABLE_COLUMN_COUNT_WIDTH = 8;
+ private static final int TABLE_COLUMN_WIDTH;
+ private final Class<? extends Kernel> kernel;
+ private final Device device;
+ private long[] currentTimes = new long[ProfilingEvent.values().length];
+ private long[] accumulatedTimes = new long[ProfilingEvent.values().length];
+ private ProfilingEvent lastEvent = null;
+ private final DecimalFormat format;
+ private long invocationCount = 0;
+
+ static {
+ assert ProfilingEvent.START.ordinal() == 0 : "ProfilingEvent.START.ordinal() != 0";
+ int max = 0;
+ for (ProfilingEvent event : ProfilingEvent.values()) {
+ max = Math.max(max, event.name().length());
+ }
+ TABLE_COLUMN_WIDTH = max + 1;
+ }
+
+ public KernelDeviceProfile(Class<? extends Kernel> kernel, Device device) {
+ this.kernel = kernel;
+ this.device = device;
+ this.format = (DecimalFormat) DecimalFormat.getNumberInstance();
+ format.setMinimumFractionDigits(3);
+ format.setMaximumFractionDigits(3);
+ }
+
+ public void onEvent(ProfilingEvent event) {
+ if (event == ProfilingEvent.START) {
+ if (lastEvent != null) {
+ logger.log(Level.SEVERE, "ProfilingEvent.START encountered without ProfilingEvent.EXECUTED");
+ } else if (lastEvent == ProfilingEvent.START) {
+ logger.log(Level.SEVERE, "Duplicate event ProfilingEvent.START");
+ }
+ Arrays.fill(currentTimes, 0L);
+ ++invocationCount;
+ } else {
+ if (lastEvent == null) {
+ if (event != ProfilingEvent.EXECUTED) {
+ logger.log(Level.SEVERE, "ProfilingEvent.START was not invoked prior to ProfilingEvent." + event);
+ }
+ } else {
+ for (int i = lastEvent.ordinal() + 1; i < event.ordinal(); ++i) {
+ currentTimes[i] = currentTimes[i - 1];
+ }
+ }
+ }
+ currentTimes[event.ordinal()] = System.nanoTime();
+ if (event == ProfilingEvent.EXECUTED) {
+ for (int i = 1; i < currentTimes.length; ++i) {
+ long elapsed = currentTimes[i] - currentTimes[i - 1];
+ if (elapsed < 0) {
+ logger.log(Level.SEVERE, "negative elapsed time for event " + event);
+ break;
+ }
+ accumulatedTimes[i] += elapsed;
+ }
+ }
+ lastEvent = event;
+ if (event == ProfilingEvent.EXECUTED) {
+ lastEvent = null;
+ }
+ }
+
+ /** Elapsed time for a single event only, i.e. since the previous stage rather than from the start. */
+ public double getLastElapsedTime(ProfilingEvent stage) {
+ if (stage == ProfilingEvent.START) {
+ return 0;
+ }
+ return (currentTimes[stage.ordinal()] - currentTimes[stage.ordinal() - 1]) / MILLION;
+ }
+
+ /** Elapsed time for all events {@code from} through {@code to}.*/
+ public double getLastElapsedTime(ProfilingEvent from, ProfilingEvent to) {
+ return (currentTimes[to.ordinal()] - currentTimes[from.ordinal()]) / MILLION;
+ }
+
+ /** Elapsed time for a single event only, i.e. since the previous stage rather than from the start, summed over all executions. */
+ public double getCumulativeElapsedTime(ProfilingEvent stage) {
+ return (accumulatedTimes[stage.ordinal()]) / MILLION;
+ }
+
+ /** Elapsed time of entire execution, summed over all executions. */
+ public double getCumulativeElapsedTimeAll() {
+ double sum = 0;
+ for (int i = 1; i <= ProfilingEvent.EXECUTED.ordinal(); ++i) {
+ sum += accumulatedTimes[i];
+ }
+ return sum;
+ }
+
+ public static String getTableHeader() {
+ int length = ProfilingEvent.values().length;
+ StringBuilder builder = new StringBuilder(150);
+ appendRowHeaders(builder, "Device", "Count");
+ for (int i = 1; i < length; ++i) {
+ ProfilingEvent stage = ProfilingEvent.values()[i];
+ String heading = stage.name();
+ appendCell(builder, heading);
+ }
+ builder.append(" ").append("Total");
+ return builder.toString();
+ }
+
+ public String getLastAsTableRow() {
+ double total = 0;
+ StringBuilder builder = new StringBuilder(150);
+ appendRowHeaders(builder, device.getShortDescription(), String.valueOf(invocationCount));
+ for (int i = 1; i < currentTimes.length; ++i) {
+ ProfilingEvent stage = ProfilingEvent.values()[i];
+ double time = getLastElapsedTime(stage);
+ total += time;
+ String formatted = format.format(time);
+ appendCell(builder, formatted);
+ }
+ builder.append(" ").append(format.format(total));
+ return builder.toString();
+ }
+
+ public String getCumulativeAsTableRow() {
+ return internalCumulativeAsTableRow(false);
+ }
+
+ public String getAverageAsTableRow() {
+ return internalCumulativeAsTableRow(true);
+ }
+
+ private String internalCumulativeAsTableRow(boolean mean) {
+ double total = 0;
+ double count = mean ? invocationCount : 1;
+ StringBuilder builder = new StringBuilder(150);
+ appendRowHeaders(builder, device.getShortDescription(), String.valueOf(invocationCount));
+ for (int i = 1; i < currentTimes.length; ++i) {
+ ProfilingEvent stage = ProfilingEvent.values()[i];
+ double time = getCumulativeElapsedTime(stage);
+ if (mean) {
+ time /= count;
+ }
+ total += time;
+ String formatted = format.format(time);
+ appendCell(builder, formatted);
+ }
+ builder.append(" ").append(format.format(total));
+ return builder.toString();
+ }
+
+ private static void appendRowHeaders(StringBuilder builder, String device, String count) {
+ if (device.length() > TABLE_COLUMN_HEADER_WIDTH - 1) {
+ device = device.substring(0, TABLE_COLUMN_HEADER_WIDTH - 1);
+ }
+ builder.append(device);
+ int padding = TABLE_COLUMN_HEADER_WIDTH - device.length();
+ for (int i = 0; i < padding; ++i) {
+ builder.append(' ');
+ }
+
+ builder.append(count);
+ padding = TABLE_COLUMN_COUNT_WIDTH - count.length();
+ for (int i = 0; i < padding; ++i) {
+ builder.append(' ');
+ }
+ }
+
+ private static void appendCell(StringBuilder builder, String cell) {
+ int padding = TABLE_COLUMN_WIDTH - cell.length();
+ for (int paddingIndex = 0; paddingIndex < padding; ++paddingIndex) {
+ builder.append(' ');
+ }
+ builder.append(cell);
+ }
+
+ @Override
+ public String toString() {
+ return "KernelDeviceProfile{" + kernel.toString() + ", " + device.getShortDescription() + "}";
+ }
+}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManager.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManager.java
index c1f29cbc..3ced0ae0 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManager.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManager.java
@@ -1,300 +1,300 @@
-package com.amd.aparapi.internal.kernel;
-
-import com.amd.aparapi.*;
-import com.amd.aparapi.device.*;
-import com.amd.aparapi.internal.util.*;
-
-import java.lang.reflect.*;
-import java.util.*;
-
-/**
- * Created by Barney on 24/08/2015.
- */
-public class KernelManager {
-
- private static KernelManager INSTANCE = new KernelManager();
- private LinkedHashMap<Class<? extends Kernel>, KernelPreferences> preferences = new LinkedHashMap<>();
- private LinkedHashMap<Class<? extends Kernel>, KernelProfile> profiles = new LinkedHashMap<>();
- private LinkedHashMap<Class<? extends Kernel>, Kernel> sharedInstances = new LinkedHashMap<>();
-
- private KernelPreferences defaultPreferences;
-
- protected KernelManager() {
- defaultPreferences = createDefaultPreferences();
- }
-
- public static KernelManager instance() {
- return INSTANCE;
- }
-
- public static void setKernelManager(KernelManager manager) {
- INSTANCE = manager;
- }
-
- static {
- if (Config.dumpProfilesOnExit) {
- Runtime.getRuntime().addShutdownHook(new Thread() {
- @Override
- public void run() {
- StringBuilder builder = new StringBuilder(2048);
- instance().reportProfilingSummary(builder);
- System.out.println(builder);
- }
- });
- }
- }
-
- /** This method returns a shared instance of a given Kernel subclass. The kernelClass needs a no-args constructor, which
- * need not be public.
- *
- * <p>Given that compilation of OpenCL is relatively expensive and that (currently!) there is no caching of compiled OpenCL
- * it is desirable to only ever create one instance of any given Kernel subclass, which this method facilitates.</p>
- *
- * <p>In order to maintain thread saftey, it is necessary to synchronize on the returned kernel for the duration of the process of setting up,
- * executing and extracting the results from that kernel, when using a shared instance.</p>
- *
- * @throws RuntimeException if the class cannot be instantiated
- */
- public static <T extends Kernel> T sharedKernelInstance(Class<T> kernelClass) {
- return instance().getSharedKernelInstance(kernelClass);
- }
-
- /** Append a report to {@code builder} which contains information, per Kernel subclass, on which device is currently being used for the
- * kernel class, and which (if any) devices failed to execute a given Kernel.
- */
- public void reportDeviceUsage(StringBuilder builder, boolean withProfilingInfo) {
- builder.append("Device Usage by Kernel Subclass");
- if (withProfilingInfo) {
- builder.append(" (showing mean elapsed times in milliseconds)");
- }
- builder.append("\n\n");
- for (Class<? extends Kernel> klass : preferences.keySet()) {
- KernelPreferences preferences = this.preferences.get(klass);
- KernelProfile profile = withProfilingInfo ? profiles.get(klass) : null;
- builder.append(klass.getName()).append(":\n\tusing ").append(preferences.getPreferredDevice(null).getShortDescription());
- List<Device> failedDevices = preferences.getFailedDevices();
- if (failedDevices.size() > 0) {
- builder.append(", failed devices = ");
- for (int i = 0; i < failedDevices.size(); ++i) {
- builder.append(failedDevices.get(i).getShortDescription());
- if (i < failedDevices.size() - 1) {
- builder.append(" | ");
- }
- }
- }
- if (profile != null) {
- builder.append("\n");
- int row = 0;
- for (KernelDeviceProfile deviceProfile : profile.getDeviceProfiles()) {
- if (row == 0) {
- builder.append(deviceProfile.getTableHeader()).append("\n");
- }
- builder.append(deviceProfile.getAverageAsTableRow()).append("\n");
- ++row;
- }
- }
- builder.append("\n");
- }
- }
-
- public void reportProfilingSummary(StringBuilder builder) {
- builder.append("\nProfiles by Kernel Subclass (mean elapsed times in milliseconds)\n\n");
- builder.append(KernelDeviceProfile.getTableHeader()).append("\n");
- for (Class<? extends Kernel> kernelClass : profiles.keySet()) {
- String simpleName = Reflection.getSimpleName(kernelClass);
- String kernelName = "----------------- [[ " + simpleName + " ]] ";
- builder.append(kernelName);
- int dashes = 132 - kernelName.length();
- for (int i = 0; i < dashes; ++i) {
- builder.append('-');
- }
- builder.append("\n");
- KernelProfile kernelProfile = profiles.get(kernelClass);
- for (KernelDeviceProfile deviceProfile : kernelProfile.getDeviceProfiles()) {
- builder.append(deviceProfile.getAverageAsTableRow()).append("\n");
- }
- }
- }
-
-
- public KernelPreferences getPreferences(Kernel kernel) {
- synchronized (preferences) {
- KernelPreferences kernelPreferences = preferences.get(kernel.getClass());
- if (kernelPreferences == null) {
- kernelPreferences = new KernelPreferences(this, kernel.getClass());
- preferences.put(kernel.getClass(), kernelPreferences);
- }
- return kernelPreferences;
- }
- }
-
- public void setPreferredDevices(Kernel _kernel, LinkedHashSet<Device> _devices) {
- KernelPreferences kernelPreferences = getPreferences(_kernel);
- kernelPreferences.setPreferredDevices(_devices);
- }
-
- public KernelPreferences getDefaultPreferences() {
- return defaultPreferences;
- }
-
- public void setDefaultPreferredDevices(LinkedHashSet<Device> _devices) {
- defaultPreferences.setPreferredDevices(_devices);
- }
-
- protected KernelPreferences createDefaultPreferences() {
- KernelPreferences preferences = new KernelPreferences(this, null);
- preferences.setPreferredDevices(createDefaultPreferredDevices());
- return preferences;
- }
-
- private <T extends Kernel> T getSharedKernelInstance(Class<T> kernelClass) {
- synchronized (sharedInstances) {
- T shared = (T) sharedInstances.get(kernelClass);
- if (shared == null) {
- try {
- Constructor<T> constructor = kernelClass.getConstructor();
- constructor.setAccessible(true);
- shared = constructor.newInstance();
- sharedInstances.put(kernelClass, shared);
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- return shared;
- }
- }
-
- protected LinkedHashSet<Device> createDefaultPreferredDevices() {
- LinkedHashSet<Device> devices = new LinkedHashSet<>();
-
- List<OpenCLDevice> accelerators = OpenCLDevice.listDevices(Device.TYPE.ACC);
- List<OpenCLDevice> gpus = OpenCLDevice.listDevices(Device.TYPE.GPU);
- List<OpenCLDevice> cpus = OpenCLDevice.listDevices(Device.TYPE.CPU);
-
- Collections.sort(accelerators, getDefaultAcceleratorComparator());
- Collections.sort(gpus, getDefaultGPUComparator());
-
- List<Device.TYPE> preferredDeviceTypes = getPreferredDeviceTypes();
-
- for (Device.TYPE type : preferredDeviceTypes) {
- switch (type) {
- case UNKNOWN:
- throw new AssertionError("UNKNOWN device type not supported");
- case GPU:
- devices.addAll(gpus);
- break;
- case CPU:
- devices.add(cpus.get(0));
- break;
- case JTP:
- devices.add(JavaDevice.THREAD_POOL);
- break;
- case SEQ:
- devices.add(JavaDevice.SEQUENTIAL);
- break;
- case ACC:
- devices.addAll(accelerators);
- break;
- case ALT:
- devices.add(JavaDevice.ALTERNATIVE_ALGORITHM);
- break;
- }
- }
-
- return devices;
- }
-
- protected List<Device.TYPE> getPreferredDeviceTypes() {
- return Arrays.asList(Device.TYPE.ACC, Device.TYPE.GPU, Device.TYPE.CPU, Device.TYPE.ALT, Device.TYPE.JTP);
- }
-
- /** NB, returns -ve for the better device. */
- protected Comparator<OpenCLDevice> getDefaultAcceleratorComparator() {
- return new Comparator<OpenCLDevice>() {
- @Override
- public int compare(OpenCLDevice left, OpenCLDevice right) {
- return (right.getMaxComputeUnits() - left.getMaxComputeUnits());
- }
- };
- }
-
- /** NB, returns -ve for the better device. */
- protected Comparator<OpenCLDevice> getDefaultGPUComparator() {
- return new Comparator<OpenCLDevice>() {
- @Override
- public int compare(OpenCLDevice left, OpenCLDevice right) {
- return selectLhs(left, right) ? -1 : 1;
- }
- };
- }
-
- public Device bestDevice() {
- return getDefaultPreferences().getPreferredDevice(null);
- }
-
- protected static boolean selectLhs(OpenCLDevice _deviceLhs, OpenCLDevice _deviceRhs) {
- boolean nvidiaLhs = _deviceLhs.getOpenCLPlatform().getVendor().toLowerCase().contains("nvidia");
- boolean nvidiaRhs = _deviceRhs.getOpenCLPlatform().getVendor().toLowerCase().contains("nvidia");
- if (nvidiaLhs || nvidiaRhs) {
- return selectLhsIfCUDA(_deviceLhs, _deviceRhs);
- }
- return _deviceLhs.getMaxComputeUnits() > _deviceRhs.getMaxComputeUnits();
- }
-
- /** NVidia/CUDA architecture reports maxComputeUnits in a completely different context, i.e. maxComputeUnits is not same as
- * (is much less than) the number of OpenCL cores available.
- *
- * <p>Therefore when comparing an NVidia device we use different criteria.</p>
- */
- protected static boolean selectLhsIfCUDA(OpenCLDevice _deviceLhs, OpenCLDevice _deviceRhs) {
- if (_deviceLhs.getType() != _deviceRhs.getType()) {
- return selectLhsByType(_deviceLhs.getType(), _deviceRhs.getType());
- }
- return _deviceLhs.getMaxWorkGroupSize() == _deviceRhs.getMaxWorkGroupSize()
- ? _deviceLhs.getGlobalMemSize() > _deviceRhs.getGlobalMemSize()
- : _deviceLhs.getMaxWorkGroupSize() > _deviceRhs.getMaxWorkGroupSize();
- }
-
- private static boolean selectLhsByType(Device.TYPE lhs, Device.TYPE rhs) {
- return lhs.rank < rhs.rank;
- }
-
- public KernelProfile getProfile(Class<? extends Kernel> kernelClass) {
- synchronized (profiles) {
- KernelProfile profile = profiles.get(kernelClass);
- if (profile == null) {
- profile = new KernelProfile(kernelClass);
- profiles.put(kernelClass, profile);
- }
- return profile;
- }
- }
-
- /** New home for deprecated methods of {@link Device}. */
- public static class DeprecatedMethods {
-
- @Deprecated
- public static Device firstDevice(Device.TYPE _type) {
- List<Device> devices = instance().getDefaultPreferences().getPreferredDevices(null);
- for (Device device : devices) {
- if(device.getType() == _type) {
- return device;
- }
- }
- return null;
- }
-
- @SuppressWarnings("deprecation")
- @Deprecated
- public static Device bestGPU() {
- return firstDevice(Device.TYPE.GPU);
- }
-
- @SuppressWarnings("deprecation")
- @Deprecated
- public static Device bestACC() {
- return firstDevice(Device.TYPE.ACC);
- }
- }
-}
+package com.amd.aparapi.internal.kernel;
+
+import com.amd.aparapi.*;
+import com.amd.aparapi.device.*;
+import com.amd.aparapi.internal.util.*;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+/**
+ * Created by Barney on 24/08/2015.
+ */
+public class KernelManager {
+
+ private static KernelManager INSTANCE = new KernelManager();
+ private LinkedHashMap<Class<? extends Kernel>, KernelPreferences> preferences = new LinkedHashMap<>();
+ private LinkedHashMap<Class<? extends Kernel>, KernelProfile> profiles = new LinkedHashMap<>();
+ private LinkedHashMap<Class<? extends Kernel>, Kernel> sharedInstances = new LinkedHashMap<>();
+
+ private KernelPreferences defaultPreferences;
+
+ protected KernelManager() {
+ defaultPreferences = createDefaultPreferences();
+ }
+
+ public static KernelManager instance() {
+ return INSTANCE;
+ }
+
+ public static void setKernelManager(KernelManager manager) {
+ INSTANCE = manager;
+ }
+
+ static {
+ if (Config.dumpProfilesOnExit) {
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ @Override
+ public void run() {
+ StringBuilder builder = new StringBuilder(2048);
+ instance().reportProfilingSummary(builder);
+ System.out.println(builder);
+ }
+ });
+ }
+ }
+
+ /** This method returns a shared instance of a given Kernel subclass. The kernelClass needs a no-args constructor, which
+ * need not be public.
+ *
+ * <p>Given that compilation of OpenCL is relatively expensive and that (currently!) there is no caching of compiled OpenCL
+ * it is desirable to only ever create one instance of any given Kernel subclass, which this method facilitates.</p>
+ *
+ * <p>In order to maintain thread saftey, it is necessary to synchronize on the returned kernel for the duration of the process of setting up,
+ * executing and extracting the results from that kernel, when using a shared instance.</p>
+ *
+ * @throws RuntimeException if the class cannot be instantiated
+ */
+ public static <T extends Kernel> T sharedKernelInstance(Class<T> kernelClass) {
+ return instance().getSharedKernelInstance(kernelClass);
+ }
+
+ /** Append a report to {@code builder} which contains information, per Kernel subclass, on which device is currently being used for the
+ * kernel class, and which (if any) devices failed to execute a given Kernel.
+ */
+ public void reportDeviceUsage(StringBuilder builder, boolean withProfilingInfo) {
+ builder.append("Device Usage by Kernel Subclass");
+ if (withProfilingInfo) {
+ builder.append(" (showing mean elapsed times in milliseconds)");
+ }
+ builder.append("\n\n");
+ for (Class<? extends Kernel> klass : preferences.keySet()) {
+ KernelPreferences preferences = this.preferences.get(klass);
+ KernelProfile profile = withProfilingInfo ? profiles.get(klass) : null;
+ builder.append(klass.getName()).append(":\n\tusing ").append(preferences.getPreferredDevice(null).getShortDescription());
+ List<Device> failedDevices = preferences.getFailedDevices();
+ if (failedDevices.size() > 0) {
+ builder.append(", failed devices = ");
+ for (int i = 0; i < failedDevices.size(); ++i) {
+ builder.append(failedDevices.get(i).getShortDescription());
+ if (i < failedDevices.size() - 1) {
+ builder.append(" | ");
+ }
+ }
+ }
+ if (profile != null) {
+ builder.append("\n");
+ int row = 0;
+ for (KernelDeviceProfile deviceProfile : profile.getDeviceProfiles()) {
+ if (row == 0) {
+ builder.append(deviceProfile.getTableHeader()).append("\n");
+ }
+ builder.append(deviceProfile.getAverageAsTableRow()).append("\n");
+ ++row;
+ }
+ }
+ builder.append("\n");
+ }
+ }
+
+ public void reportProfilingSummary(StringBuilder builder) {
+ builder.append("\nProfiles by Kernel Subclass (mean elapsed times in milliseconds)\n\n");
+ builder.append(KernelDeviceProfile.getTableHeader()).append("\n");
+ for (Class<? extends Kernel> kernelClass : profiles.keySet()) {
+ String simpleName = Reflection.getSimpleName(kernelClass);
+ String kernelName = "----------------- [[ " + simpleName + " ]] ";
+ builder.append(kernelName);
+ int dashes = 132 - kernelName.length();
+ for (int i = 0; i < dashes; ++i) {
+ builder.append('-');
+ }
+ builder.append("\n");
+ KernelProfile kernelProfile = profiles.get(kernelClass);
+ for (KernelDeviceProfile deviceProfile : kernelProfile.getDeviceProfiles()) {
+ builder.append(deviceProfile.getAverageAsTableRow()).append("\n");
+ }
+ }
+ }
+
+
+ public KernelPreferences getPreferences(Kernel kernel) {
+ synchronized (preferences) {
+ KernelPreferences kernelPreferences = preferences.get(kernel.getClass());
+ if (kernelPreferences == null) {
+ kernelPreferences = new KernelPreferences(this, kernel.getClass());
+ preferences.put(kernel.getClass(), kernelPreferences);
+ }
+ return kernelPreferences;
+ }
+ }
+
+ public void setPreferredDevices(Kernel _kernel, LinkedHashSet<Device> _devices) {
+ KernelPreferences kernelPreferences = getPreferences(_kernel);
+ kernelPreferences.setPreferredDevices(_devices);
+ }
+
+ public KernelPreferences getDefaultPreferences() {
+ return defaultPreferences;
+ }
+
+ public void setDefaultPreferredDevices(LinkedHashSet<Device> _devices) {
+ defaultPreferences.setPreferredDevices(_devices);
+ }
+
+ protected KernelPreferences createDefaultPreferences() {
+ KernelPreferences preferences = new KernelPreferences(this, null);
+ preferences.setPreferredDevices(createDefaultPreferredDevices());
+ return preferences;
+ }
+
+ private <T extends Kernel> T getSharedKernelInstance(Class<T> kernelClass) {
+ synchronized (sharedInstances) {
+ T shared = (T) sharedInstances.get(kernelClass);
+ if (shared == null) {
+ try {
+ Constructor<T> constructor = kernelClass.getConstructor();
+ constructor.setAccessible(true);
+ shared = constructor.newInstance();
+ sharedInstances.put(kernelClass, shared);
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return shared;
+ }
+ }
+
+ protected LinkedHashSet<Device> createDefaultPreferredDevices() {
+ LinkedHashSet<Device> devices = new LinkedHashSet<>();
+
+ List<OpenCLDevice> accelerators = OpenCLDevice.listDevices(Device.TYPE.ACC);
+ List<OpenCLDevice> gpus = OpenCLDevice.listDevices(Device.TYPE.GPU);
+ List<OpenCLDevice> cpus = OpenCLDevice.listDevices(Device.TYPE.CPU);
+
+ Collections.sort(accelerators, getDefaultAcceleratorComparator());
+ Collections.sort(gpus, getDefaultGPUComparator());
+
+ List<Device.TYPE> preferredDeviceTypes = getPreferredDeviceTypes();
+
+ for (Device.TYPE type : preferredDeviceTypes) {
+ switch (type) {
+ case UNKNOWN:
+ throw new AssertionError("UNKNOWN device type not supported");
+ case GPU:
+ devices.addAll(gpus);
+ break;
+ case CPU:
+ devices.add(cpus.get(0));
+ break;
+ case JTP:
+ devices.add(JavaDevice.THREAD_POOL);
+ break;
+ case SEQ:
+ devices.add(JavaDevice.SEQUENTIAL);
+ break;
+ case ACC:
+ devices.addAll(accelerators);
+ break;
+ case ALT:
+ devices.add(JavaDevice.ALTERNATIVE_ALGORITHM);
+ break;
+ }
+ }
+
+ return devices;
+ }
+
+ protected List<Device.TYPE> getPreferredDeviceTypes() {
+ return Arrays.asList(Device.TYPE.ACC, Device.TYPE.GPU, Device.TYPE.CPU, Device.TYPE.ALT, Device.TYPE.JTP);
+ }
+
+ /** NB, returns -ve for the better device. */
+ protected Comparator<OpenCLDevice> getDefaultAcceleratorComparator() {
+ return new Comparator<OpenCLDevice>() {
+ @Override
+ public int compare(OpenCLDevice left, OpenCLDevice right) {
+ return (right.getMaxComputeUnits() - left.getMaxComputeUnits());
+ }
+ };
+ }
+
+ /** NB, returns -ve for the better device. */
+ protected Comparator<OpenCLDevice> getDefaultGPUComparator() {
+ return new Comparator<OpenCLDevice>() {
+ @Override
+ public int compare(OpenCLDevice left, OpenCLDevice right) {
+ return selectLhs(left, right) ? -1 : 1;
+ }
+ };
+ }
+
+ public Device bestDevice() {
+ return getDefaultPreferences().getPreferredDevice(null);
+ }
+
+ protected static boolean selectLhs(OpenCLDevice _deviceLhs, OpenCLDevice _deviceRhs) {
+ boolean nvidiaLhs = _deviceLhs.getOpenCLPlatform().getVendor().toLowerCase().contains("nvidia");
+ boolean nvidiaRhs = _deviceRhs.getOpenCLPlatform().getVendor().toLowerCase().contains("nvidia");
+ if (nvidiaLhs || nvidiaRhs) {
+ return selectLhsIfCUDA(_deviceLhs, _deviceRhs);
+ }
+ return _deviceLhs.getMaxComputeUnits() > _deviceRhs.getMaxComputeUnits();
+ }
+
+ /** NVidia/CUDA architecture reports maxComputeUnits in a completely different context, i.e. maxComputeUnits is not same as
+ * (is much less than) the number of OpenCL cores available.
+ *
+ * <p>Therefore when comparing an NVidia device we use different criteria.</p>
+ */
+ protected static boolean selectLhsIfCUDA(OpenCLDevice _deviceLhs, OpenCLDevice _deviceRhs) {
+ if (_deviceLhs.getType() != _deviceRhs.getType()) {
+ return selectLhsByType(_deviceLhs.getType(), _deviceRhs.getType());
+ }
+ return _deviceLhs.getMaxWorkGroupSize() == _deviceRhs.getMaxWorkGroupSize()
+ ? _deviceLhs.getGlobalMemSize() > _deviceRhs.getGlobalMemSize()
+ : _deviceLhs.getMaxWorkGroupSize() > _deviceRhs.getMaxWorkGroupSize();
+ }
+
+ private static boolean selectLhsByType(Device.TYPE lhs, Device.TYPE rhs) {
+ return lhs.rank < rhs.rank;
+ }
+
+ public KernelProfile getProfile(Class<? extends Kernel> kernelClass) {
+ synchronized (profiles) {
+ KernelProfile profile = profiles.get(kernelClass);
+ if (profile == null) {
+ profile = new KernelProfile(kernelClass);
+ profiles.put(kernelClass, profile);
+ }
+ return profile;
+ }
+ }
+
+ /** New home for deprecated methods of {@link Device}. */
+ public static class DeprecatedMethods {
+
+ @Deprecated
+ public static Device firstDevice(Device.TYPE _type) {
+ List<Device> devices = instance().getDefaultPreferences().getPreferredDevices(null);
+ for (Device device : devices) {
+ if(device.getType() == _type) {
+ return device;
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Deprecated
+ public static Device bestGPU() {
+ return firstDevice(Device.TYPE.GPU);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Deprecated
+ public static Device bestACC() {
+ return firstDevice(Device.TYPE.ACC);
+ }
+ }
+}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManagers.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManagers.java
index 8a31cd70..11b28b70 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManagers.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelManagers.java
@@ -1,31 +1,31 @@
-package com.amd.aparapi.internal.kernel;
-
-import com.amd.aparapi.device.*;
-
-import java.util.*;
-
-/**
- * KernelManager instances useful for debugging.
- */
-public class KernelManagers {
-
- public static final KernelManager JTP_ONLY = new KernelManager() {
-
- private List<Device.TYPE> types = Collections.singletonList(Device.TYPE.JTP);
-
- @Override
- protected List<Device.TYPE> getPreferredDeviceTypes() {
- return types;
- }
- };
-
- public static final KernelManager SEQUENTIAL_ONLY = new KernelManager() {
-
- private final List<Device.TYPE> types = Collections.singletonList(Device.TYPE.SEQ);
-
- @Override
- protected List<Device.TYPE> getPreferredDeviceTypes() {
- return types;
- }
- };
-}
+package com.amd.aparapi.internal.kernel;
+
+import com.amd.aparapi.device.*;
+
+import java.util.*;
+
+/**
+ * KernelManager instances useful for debugging.
+ */
+public class KernelManagers {
+
+ public static final KernelManager JTP_ONLY = new KernelManager() {
+
+ private List<Device.TYPE> types = Collections.singletonList(Device.TYPE.JTP);
+
+ @Override
+ protected List<Device.TYPE> getPreferredDeviceTypes() {
+ return types;
+ }
+ };
+
+ public static final KernelManager SEQUENTIAL_ONLY = new KernelManager() {
+
+ private final List<Device.TYPE> types = Collections.singletonList(Device.TYPE.SEQ);
+
+ @Override
+ protected List<Device.TYPE> getPreferredDeviceTypes() {
+ return types;
+ }
+ };
+}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelProfile.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelProfile.java
index 17e479a8..647ab513 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelProfile.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelProfile.java
@@ -1,103 +1,103 @@
-package com.amd.aparapi.internal.kernel;
-
-import com.amd.aparapi.*;
-import com.amd.aparapi.device.*;
-
-import java.util.*;
-import java.util.logging.*;
-
-/**
- * Collects profiling information per kernel class per device. Not thread safe, it is necessary for client code to correctly synchronize on
- * objects of this class.
- */
-public class KernelProfile {
-
- private static Logger logger = Logger.getLogger(Config.getLoggerName());
- private final Class<? extends Kernel> kernelClass;
- private LinkedHashMap<Device, KernelDeviceProfile> deviceProfiles = new LinkedHashMap<>();
- private Device currentDevice;
- private Device lastDevice;
- private KernelDeviceProfile currentDeviceProfile;
-
- public KernelProfile(Class<? extends Kernel> _kernelClass) {
- kernelClass = _kernelClass;
- }
-
- public double getLastExecutionTime() {
- KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
- return lastDeviceProfile == null ? Double.NaN : lastDeviceProfile.getLastElapsedTime(ProfilingEvent.START, ProfilingEvent.EXECUTED);
- }
-
- public double getLastConversionTime() {
- KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
- return lastDeviceProfile == null ? Double.NaN : lastDeviceProfile.getLastElapsedTime(ProfilingEvent.START, ProfilingEvent.EXECUTED); }
-
- public double getAccumulatedTotalTime() {
- KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
- if (lastDeviceProfile == null) {
- return Double.NaN;
- }
- else {
- return lastDeviceProfile.getCumulativeElapsedTimeAll();
- }
- }
-
- private KernelDeviceProfile getLastDeviceProfile() {
- return null;
- }
-
- void onStart(Device device) {
- currentDevice = device;
- synchronized (deviceProfiles) {
- currentDeviceProfile = deviceProfiles.get(device);
- if (currentDeviceProfile == null) {
- currentDeviceProfile = new KernelDeviceProfile(kernelClass, device);
- deviceProfiles.put(device, currentDeviceProfile);
- }
- }
- currentDeviceProfile.onEvent(ProfilingEvent.START);
- }
-
- void onEvent(ProfilingEvent event) {
- switch (event) {
- case CLASS_MODEL_BUILT: // fallthrough
- case OPENCL_GENERATED: // fallthrough
- case OPENCL_COMPILED: // fallthrough
- case PREPARE_EXECUTE: // fallthrough
- case EXECUTED: // fallthrough
- {
- if (currentDeviceProfile == null) {
- logger.log(Level.SEVERE, "Error in KernelProfile, no currentDevice (synchronization error?");
- }
- currentDeviceProfile.onEvent(event);
- break;
- }
- case START:
- throw new IllegalArgumentException("must use onStart(Device) to start profiling");
- default:
- throw new IllegalArgumentException("Unhandled event " + event);
- }
- }
-
- void onFinishedExecution() {
- reset();
- }
-
- private void reset() {
- lastDevice = currentDevice;
- currentDevice = null;
- currentDeviceProfile = null;
- }
-
- public Collection<Device> getDevices() {
- return deviceProfiles.keySet();
- }
-
- public Collection<KernelDeviceProfile> getDeviceProfiles() {
- return deviceProfiles.values();
- }
-
- public KernelDeviceProfile getDeviceProfile(Device device) {
- return deviceProfiles.get(device);
- }
-}
+package com.amd.aparapi.internal.kernel;
+
+import com.amd.aparapi.*;
+import com.amd.aparapi.device.*;
+
+import java.util.*;
+import java.util.logging.*;
+
+/**
+ * Collects profiling information per kernel class per device. Not thread safe, it is necessary for client code to correctly synchronize on
+ * objects of this class.
+ */
+public class KernelProfile {
+
+ private static Logger logger = Logger.getLogger(Config.getLoggerName());
+ private final Class<? extends Kernel> kernelClass;
+ private LinkedHashMap<Device, KernelDeviceProfile> deviceProfiles = new LinkedHashMap<>();
+ private Device currentDevice;
+ private Device lastDevice;
+ private KernelDeviceProfile currentDeviceProfile;
+
+ public KernelProfile(Class<? extends Kernel> _kernelClass) {
+ kernelClass = _kernelClass;
+ }
+
+ public double getLastExecutionTime() {
+ KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
+ return lastDeviceProfile == null ? Double.NaN : lastDeviceProfile.getLastElapsedTime(ProfilingEvent.START, ProfilingEvent.EXECUTED);
+ }
+
+ public double getLastConversionTime() {
+ KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
+ return lastDeviceProfile == null ? Double.NaN : lastDeviceProfile.getLastElapsedTime(ProfilingEvent.START, ProfilingEvent.EXECUTED); }
+
+ public double getAccumulatedTotalTime() {
+ KernelDeviceProfile lastDeviceProfile = getLastDeviceProfile();
+ if (lastDeviceProfile == null) {
+ return Double.NaN;
+ }
+ else {
+ return lastDeviceProfile.getCumulativeElapsedTimeAll();
+ }
+ }
+
+ private KernelDeviceProfile getLastDeviceProfile() {
+ return null;
+ }
+
+ void onStart(Device device) {
+ currentDevice = device;
+ synchronized (deviceProfiles) {
+ currentDeviceProfile = deviceProfiles.get(device);
+ if (currentDeviceProfile == null) {
+ currentDeviceProfile = new KernelDeviceProfile(kernelClass, device);
+ deviceProfiles.put(device, currentDeviceProfile);
+ }
+ }
+ currentDeviceProfile.onEvent(ProfilingEvent.START);
+ }
+
+ void onEvent(ProfilingEvent event) {
+ switch (event) {
+ case CLASS_MODEL_BUILT: // fallthrough
+ case OPENCL_GENERATED: // fallthrough
+ case OPENCL_COMPILED: // fallthrough
+ case PREPARE_EXECUTE: // fallthrough
+ case EXECUTED: // fallthrough
+ {
+ if (currentDeviceProfile == null) {
+ logger.log(Level.SEVERE, "Error in KernelProfile, no currentDevice (synchronization error?");
+ }
+ currentDeviceProfile.onEvent(event);
+ break;
+ }
+ case START:
+ throw new IllegalArgumentException("must use onStart(Device) to start profiling");
+ default:
+ throw new IllegalArgumentException("Unhandled event " + event);
+ }
+ }
+
+ void onFinishedExecution() {
+ reset();
+ }
+
+ private void reset() {
+ lastDevice = currentDevice;
+ currentDevice = null;
+ currentDeviceProfile = null;
+ }
+
+ public Collection<Device> getDevices() {
+ return deviceProfiles.keySet();
+ }
+
+ public Collection<KernelDeviceProfile> getDeviceProfiles() {
+ return deviceProfiles.values();
+ }
+
+ public KernelDeviceProfile getDeviceProfile(Device device) {
+ return deviceProfiles.get(device);
+ }
+}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/ProfilingEvent.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/ProfilingEvent.java
index 77959b65..fcb06bfd 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/ProfilingEvent.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/ProfilingEvent.java
@@ -1,8 +1,8 @@
-package com.amd.aparapi.internal.kernel;
-
-/**
- * Created by Barney on 02/09/2015.
- */
-public enum ProfilingEvent {
- START, CLASS_MODEL_BUILT, OPENCL_GENERATED, OPENCL_COMPILED, PREPARE_EXECUTE, EXECUTED
-}
+package com.amd.aparapi.internal.kernel;
+
+/**
+ * Created by Barney on 02/09/2015.
+ */
+public enum ProfilingEvent {
+ START, CLASS_MODEL_BUILT, OPENCL_GENERATED, OPENCL_COMPILED, PREPARE_EXECUTE, EXECUTED
+}
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/util/Reflection.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/util/Reflection.java
index 3f2ad65d..ba7a553a 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/util/Reflection.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/util/Reflection.java
@@ -1,18 +1,18 @@
-package com.amd.aparapi.internal.util;
-
-/**
- * Created by Barney on 03/09/2015.
- */
-public class Reflection {
-
- /** Avoids getting dumb empty names for anonymous inners. */
- public static String getSimpleName(Class<?> klass) {
- String simpleName = klass.getSimpleName();
- if (simpleName.isEmpty()) {
- String fullName = klass.getName();
- int index = fullName.lastIndexOf('.');
- simpleName = (index < 0) ? fullName : fullName.substring(index + 1);
- }
- return simpleName;
- }
-}
+package com.amd.aparapi.internal.util;
+
+/**
+ * Created by Barney on 03/09/2015.
+ */
+public class Reflection {
+
+ /** Avoids getting dumb empty names for anonymous inners. */
+ public static String getSimpleName(Class<?> klass) {
+ String simpleName = klass.getSimpleName();
+ if (simpleName.isEmpty()) {
+ String fullName = klass.getName();
+ int index = fullName.lastIndexOf('.');
+ simpleName = (index < 0) ? fullName : fullName.substring(index + 1);
+ }
+ return simpleName;
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/ConfigurationDemo.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/ConfigurationDemo.java
index 2e52a6e1..bdfb3cf2 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/ConfigurationDemo.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/ConfigurationDemo.java
@@ -1,82 +1,82 @@
-package com.amd.aparapi.sample.configuration;
-
-import com.amd.aparapi.*;
-import com.amd.aparapi.internal.kernel.*;
-
-import java.util.*;
-
-/**
- * Tests device selection via {@link com.amd.aparapi.internal.kernel.KernelManager}.
- */
-public class ConfigurationDemo {
- public static void main(String[] ignored) {
- System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
-
- StringBuilder report;
-
- List<Integer> tests = Arrays.asList(0, 1, 2, 3);
- int reps = 300;
- for (int rep = 0; rep < reps; ++rep) {
- runTests(rep == 0, tests);
-
- if (rep % 100 == 99 || rep == 0) {
- report = new StringBuilder("rep = " + rep + "\n");
- KernelManager.instance().reportDeviceUsage(report, true);
- System.out.println(report);
- }
- }
- }
-
- private static void runTests(boolean verbose, List<Integer> testIndicesToRun) {
- final int globalSize = 1;
- Kernel kernel;
- if (testIndicesToRun.contains(0)) {
- if (verbose) {
- System.out.println();
- System.out.println("Testing default KernelPreferences with kernel which cannot be run in OpenCL, with fallback algorithm");
- System.out.println();
- }
- kernel = new KernelWithAlternateFallbackAlgorithm();
- kernel.execute(globalSize);
- kernel.dispose();
- }
-
- if (testIndicesToRun.contains(1)) {
- if (verbose) {
- System.out.println();
- System.out.println("Testing default KernelPreferences with kernel which cannot be run in OpenCL, without fallback algorithm");
- System.out.println();
- }
- kernel = new KernelWithoutAlternateFallbackAlgorithm();
- kernel.execute(globalSize);
- kernel.dispose();
- }
-
- if (testIndicesToRun.contains(2)) {
- if (verbose) {
- System.out.println();
- System.out.println("Retesting previous case, should jump straight to regular java implementation without warnings");
- System.out.println();
- }
- kernel = new KernelWithoutAlternateFallbackAlgorithm();
- kernel.execute(globalSize);
- kernel.dispose();
- }
-
- if (testIndicesToRun.contains(3)) {
- if (verbose) {
- System.out.println();
- System.out.println("Testing default KernelPreferences with kernel which should be run in OpenCL");
- System.out.println();
- }
- KernelOkayInOpenCL clKernel = new KernelOkayInOpenCL();
- kernel = clKernel;
- kernel.execute(clKernel.inChars.length);
- String result = new String(clKernel.outChars);
- if (verbose) {
- System.out.println("kernel output: " + result);
- }
- kernel.dispose();
- }
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+import com.amd.aparapi.*;
+import com.amd.aparapi.internal.kernel.*;
+
+import java.util.*;
+
+/**
+ * Tests device selection via {@link com.amd.aparapi.internal.kernel.KernelManager}.
+ */
+public class ConfigurationDemo {
+ public static void main(String[] ignored) {
+ System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
+
+ StringBuilder report;
+
+ List<Integer> tests = Arrays.asList(0, 1, 2, 3);
+ int reps = 300;
+ for (int rep = 0; rep < reps; ++rep) {
+ runTests(rep == 0, tests);
+
+ if (rep % 100 == 99 || rep == 0) {
+ report = new StringBuilder("rep = " + rep + "\n");
+ KernelManager.instance().reportDeviceUsage(report, true);
+ System.out.println(report);
+ }
+ }
+ }
+
+ private static void runTests(boolean verbose, List<Integer> testIndicesToRun) {
+ final int globalSize = 1;
+ Kernel kernel;
+ if (testIndicesToRun.contains(0)) {
+ if (verbose) {
+ System.out.println();
+ System.out.println("Testing default KernelPreferences with kernel which cannot be run in OpenCL, with fallback algorithm");
+ System.out.println();
+ }
+ kernel = new KernelWithAlternateFallbackAlgorithm();
+ kernel.execute(globalSize);
+ kernel.dispose();
+ }
+
+ if (testIndicesToRun.contains(1)) {
+ if (verbose) {
+ System.out.println();
+ System.out.println("Testing default KernelPreferences with kernel which cannot be run in OpenCL, without fallback algorithm");
+ System.out.println();
+ }
+ kernel = new KernelWithoutAlternateFallbackAlgorithm();
+ kernel.execute(globalSize);
+ kernel.dispose();
+ }
+
+ if (testIndicesToRun.contains(2)) {
+ if (verbose) {
+ System.out.println();
+ System.out.println("Retesting previous case, should jump straight to regular java implementation without warnings");
+ System.out.println();
+ }
+ kernel = new KernelWithoutAlternateFallbackAlgorithm();
+ kernel.execute(globalSize);
+ kernel.dispose();
+ }
+
+ if (testIndicesToRun.contains(3)) {
+ if (verbose) {
+ System.out.println();
+ System.out.println("Testing default KernelPreferences with kernel which should be run in OpenCL");
+ System.out.println();
+ }
+ KernelOkayInOpenCL clKernel = new KernelOkayInOpenCL();
+ kernel = clKernel;
+ kernel.execute(clKernel.inChars.length);
+ String result = new String(clKernel.outChars);
+ if (verbose) {
+ System.out.println("kernel output: " + result);
+ }
+ kernel.dispose();
+ }
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/CustomConfigurationDemo.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/CustomConfigurationDemo.java
index 476737d4..5ee4b8eb 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/CustomConfigurationDemo.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/CustomConfigurationDemo.java
@@ -1,42 +1,42 @@
-package com.amd.aparapi.sample.configuration;
-
-import com.amd.aparapi.device.*;
-import com.amd.aparapi.internal.kernel.*;
-
-import java.util.*;
-
-/**
- * Created by Barney on 31/08/2015.
- */
-public class CustomConfigurationDemo {
-
- public static void main(String[] ignored) {
- System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
- KernelManager manager = new KernelManager() {
- @Override
- protected List<Device.TYPE> getPreferredDeviceTypes() {
- return Arrays.asList(Device.TYPE.CPU, Device.TYPE.ALT, Device.TYPE.JTP);
- }
- };
- KernelManager.setKernelManager(manager);
-
- System.out.println("\nTesting custom KernelPreferences with kernel, preferences choose CPU");
- KernelOkayInOpenCL kernel = new KernelOkayInOpenCL();
- kernel.execute(kernel.inChars.length);
- System.out.println(kernel.outChars);
-
- System.out.println("\nTesting custom KernelPreferences with kernel, preferences specify CPU but kernel vetos CPU");
- kernel = new KernelOkayInOpenCL() {
- @Override
- public boolean isAllowDevice(Device _device) {
- return _device.getType() != Device.TYPE.CPU;
- }
- };
- kernel.execute(kernel.inChars.length);
- System.out.println(kernel.outChars);
-
- StringBuilder report = new StringBuilder("\n");
- KernelManager.instance().reportDeviceUsage(report, true);
- System.out.println(report);
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+import com.amd.aparapi.device.*;
+import com.amd.aparapi.internal.kernel.*;
+
+import java.util.*;
+
+/**
+ * Created by Barney on 31/08/2015.
+ */
+public class CustomConfigurationDemo {
+
+ public static void main(String[] ignored) {
+ System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
+ KernelManager manager = new KernelManager() {
+ @Override
+ protected List<Device.TYPE> getPreferredDeviceTypes() {
+ return Arrays.asList(Device.TYPE.CPU, Device.TYPE.ALT, Device.TYPE.JTP);
+ }
+ };
+ KernelManager.setKernelManager(manager);
+
+ System.out.println("\nTesting custom KernelPreferences with kernel, preferences choose CPU");
+ KernelOkayInOpenCL kernel = new KernelOkayInOpenCL();
+ kernel.execute(kernel.inChars.length);
+ System.out.println(kernel.outChars);
+
+ System.out.println("\nTesting custom KernelPreferences with kernel, preferences specify CPU but kernel vetos CPU");
+ kernel = new KernelOkayInOpenCL() {
+ @Override
+ public boolean isAllowDevice(Device _device) {
+ return _device.getType() != Device.TYPE.CPU;
+ }
+ };
+ kernel.execute(kernel.inChars.length);
+ System.out.println(kernel.outChars);
+
+ StringBuilder report = new StringBuilder("\n");
+ KernelManager.instance().reportDeviceUsage(report, true);
+ System.out.println(report);
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelOkayInOpenCL.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelOkayInOpenCL.java
index 6ed54e5b..9423d715 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelOkayInOpenCL.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelOkayInOpenCL.java
@@ -1,21 +1,21 @@
-package com.amd.aparapi.sample.configuration;
-
-/**
- * Created by Barney on 24/08/2015.
- */
-public class KernelOkayInOpenCL extends com.amd.aparapi.Kernel {
- char[] inChars = "KernelOkayInOpenCL".toCharArray();
- char[] outChars = new char[inChars.length];
-
- @Override
- public void run() {
- int index = getGlobalId();
- oops();
- outChars[index] = inChars[index];
- }
-
- @NoCL
- private void oops() {
- System.out.println("Oops, running in kernel in Java");
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+/**
+ * Created by Barney on 24/08/2015.
+ */
+public class KernelOkayInOpenCL extends com.amd.aparapi.Kernel {
+ char[] inChars = "KernelOkayInOpenCL".toCharArray();
+ char[] outChars = new char[inChars.length];
+
+ @Override
+ public void run() {
+ int index = getGlobalId();
+ oops();
+ outChars[index] = inChars[index];
+ }
+
+ @NoCL
+ private void oops() {
+ System.out.println("Oops, running in kernel in Java");
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithAlternateFallbackAlgorithm.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithAlternateFallbackAlgorithm.java
index 670e6a66..6aee117e 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithAlternateFallbackAlgorithm.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithAlternateFallbackAlgorithm.java
@@ -1,24 +1,24 @@
-package com.amd.aparapi.sample.configuration;
-
-import com.amd.aparapi.*;
-
-/**
- * Kernel which will always fail to run on an OpenCLDevice but has an alternative fallback algorithm.
- */
-public class KernelWithAlternateFallbackAlgorithm extends Kernel {
- @Override
- public void run() {
- // deliberately, will fail to generate OpenCL as println is unsupported
- System.out.println("Running in Java (regular algorithm)");
- }
-
- @Override
- public boolean hasFallbackAlgorithm() {
- return true;
- }
-
- @Override
- public void executeFallbackAlgorithm(Range _range, int _passes) {
- System.out.println("Running in Java (alternate non-parallel algorithm)");
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+import com.amd.aparapi.*;
+
+/**
+ * Kernel which will always fail to run on an OpenCLDevice but has an alternative fallback algorithm.
+ */
+public class KernelWithAlternateFallbackAlgorithm extends Kernel {
+ @Override
+ public void run() {
+ // deliberately, will fail to generate OpenCL as println is unsupported
+ System.out.println("Running in Java (regular algorithm)");
+ }
+
+ @Override
+ public boolean hasFallbackAlgorithm() {
+ return true;
+ }
+
+ @Override
+ public void executeFallbackAlgorithm(Range _range, int _passes) {
+ System.out.println("Running in Java (alternate non-parallel algorithm)");
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithoutAlternateFallbackAlgorithm.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithoutAlternateFallbackAlgorithm.java
index 1096a092..bdc1a120 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithoutAlternateFallbackAlgorithm.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/KernelWithoutAlternateFallbackAlgorithm.java
@@ -1,14 +1,14 @@
-package com.amd.aparapi.sample.configuration;
-
-import com.amd.aparapi.*;
-
-/**
- * Kernel which will always fail to run on an OpenCLDevice but has an alternative fallback algorithm.
- */
-public class KernelWithoutAlternateFallbackAlgorithm extends Kernel {
- @Override
- public void run() {
- // deliberately, will fail to generate OpenCL as println is unsupported
- System.out.println("Running in Java (regular algorithm)");
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+import com.amd.aparapi.*;
+
+/**
+ * Kernel which will always fail to run on an OpenCLDevice but has an alternative fallback algorithm.
+ */
+public class KernelWithoutAlternateFallbackAlgorithm extends Kernel {
+ @Override
+ public void run() {
+ // deliberately, will fail to generate OpenCL as println is unsupported
+ System.out.println("Running in Java (regular algorithm)");
+ }
+}
diff --git a/samples/configuration/src/com/amd/aparapi/sample/configuration/LegacyConfigurationDemo.java b/samples/configuration/src/com/amd/aparapi/sample/configuration/LegacyConfigurationDemo.java
index db4149a1..73ea9d70 100644
--- a/samples/configuration/src/com/amd/aparapi/sample/configuration/LegacyConfigurationDemo.java
+++ b/samples/configuration/src/com/amd/aparapi/sample/configuration/LegacyConfigurationDemo.java
@@ -1,26 +1,26 @@
-package com.amd.aparapi.sample.configuration;
-
-import com.amd.aparapi.*;
-import com.amd.aparapi.internal.kernel.*;
-
-/**
- * Tests device selection when circumventing the {@link com.amd.aparapi.internal.kernel.KernelManager} by using the legacy mechanism
- * (setExecutionMode, etc.).
- */
-public class LegacyConfigurationDemo {
-
- @SuppressWarnings("deprecation")
- public static void main(String[] ignored) {
- System.setProperty("com.amd.aparapi.executionMode", "GPU,CPU,SEQ");
- System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
-
- KernelWithAlternateFallbackAlgorithm kernel = new KernelWithAlternateFallbackAlgorithm();
- kernel.setExecutionMode(Kernel.EXECUTION_MODE.GPU);
- int globalRange = 1;
- kernel.execute(globalRange);
-
- StringBuilder report = new StringBuilder("\n");
- KernelManager.instance().reportDeviceUsage(report, true);
- System.out.println(report);
- }
-}
+package com.amd.aparapi.sample.configuration;
+
+import com.amd.aparapi.*;
+import com.amd.aparapi.internal.kernel.*;
+
+/**
+ * Tests device selection when circumventing the {@link com.amd.aparapi.internal.kernel.KernelManager} by using the legacy mechanism
+ * (setExecutionMode, etc.).
+ */
+public class LegacyConfigurationDemo {
+
+ @SuppressWarnings("deprecation")
+ public static void main(String[] ignored) {
+ System.setProperty("com.amd.aparapi.executionMode", "GPU,CPU,SEQ");
+ System.setProperty("com.amd.aparapi.dumpProfilesOnExit", "true");
+
+ KernelWithAlternateFallbackAlgorithm kernel = new KernelWithAlternateFallbackAlgorithm();
+ kernel.setExecutionMode(Kernel.EXECUTION_MODE.GPU);
+ int globalRange = 1;
+ kernel.execute(globalRange);
+
+ StringBuilder report = new StringBuilder("\n");
+ KernelManager.instance().reportDeviceUsage(report, true);
+ System.out.println(report);
+ }
+}
--
GitLab