Skip to content

Commit

Permalink
Added analytics functions
Browse files Browse the repository at this point in the history
Added analytics functions so that host functions can be called after
simulation exit and after each simulation step. An example based on the
circles model is provided.
  • Loading branch information
mondus committed Oct 23, 2016
1 parent 4232c08 commit 4f9de4c
Show file tree
Hide file tree
Showing 11 changed files with 10,154 additions and 0 deletions.
30 changes: 30 additions & 0 deletions FLAMEGPU/schemas/XMMLGPU.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
<xs:extension base="xmml:environment_type">
<xs:sequence>
<xs:element ref="initFunctions" maxOccurs="1" minOccurs="0" />
<xs:element ref="exitFunctions" maxOccurs="1" minOccurs="0" />
<xs:element ref="stepFunctions" maxOccurs="1" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
Expand Down Expand Up @@ -247,6 +249,34 @@
</xs:complexType>
<xs:element name="initFunctions" type="initFunctions_type">
</xs:element>
<xs:element name="exitFunction">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="exitFunctions_type">
<xs:sequence>
<xs:element ref="exitFunction" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="exitFunctions" type="exitFunctions_type">
</xs:element>
<xs:element name="stepFunction">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="stepFunctions_type">
<xs:sequence>
<xs:element ref="stepFunction" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="stepFunctions" type="stepFunctions_type">
</xs:element>
<xs:complexType name="layer_function_type">
<xs:complexContent>
<xs:extension base="xmml:layer_function_type">
Expand Down
35 changes: 35 additions & 0 deletions FLAMEGPU/templates/header.xslt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
#define __FLAME_GPU_FUNC__ __device__
//Definition for a function used to initialise environment variables
#define __FLAME_GPU_INIT_FUNC__
#define __FLAME_GPU_STEP_FUNC__
#define __FLAME_GPU_EXIT_FUNC__

#define USE_CUDA_STREAMS
#define FAST_ATOMIC_SORTING
Expand Down Expand Up @@ -411,6 +413,39 @@ extern int get_<xsl:value-of select="xmml:name"/>_population_width();
</xsl:for-each>


/* Analytics functions for each varible in each state*/
typedef enum {
REDUCTION_MAX,
REDUCTION_MIN,
REDUCTION_SUM
}reduction_operator;

<xsl:for-each select="gpu:xmodel/xmml:xagents/gpu:xagent">
<xsl:variable name="agent_name" select="xmml:name"/>
<xsl:for-each select="xmml:states/gpu:state">
<xsl:variable name="state" select="xmml:name"/>
<xsl:for-each select="../../xmml:memory/gpu:variable">
/** <xsl:value-of select="xmml:type"/> reduce_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable();
* Reduction functions can be used by visualisations, step and exit functions to gather data for plotting or updating global variables
* @return the reduced variable value of the specified agent name and state
*/
<xsl:value-of select="xmml:type"/> reduce_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable();


<xsl:if test="xmml:type='int'">
/** <xsl:value-of select="xmml:type"/> count_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable(int count_value){
* Count can be used for integer only agent variables and allows unique values to be counted using a reduction. Useful for generating histograms.
* @param count_value The unique value which should be counted
* @return The number of unique values of the count_value found in the agent state varaible list
*/
<xsl:value-of select="xmml:type"/> count_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable(int count_value);
</xsl:if>

</xsl:for-each>
</xsl:for-each>
</xsl:for-each>


/* global constant variables */
<xsl:for-each select="gpu:xmodel/gpu:environment/gpu:constants/gpu:variable">
__constant__ <xsl:value-of select="xmml:type"/><xsl:text> </xsl:text><xsl:value-of select="xmml:name"/><xsl:if test="xmml:arrayLength">[<xsl:value-of select="xmml:arrayLength"/>]</xsl:if>;
Expand Down
35 changes: 35 additions & 0 deletions FLAMEGPU/templates/simulation.xslt
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,11 @@ void sort_<xsl:value-of select="../../xmml:name"/>s_<xsl:value-of select="xmml:n

void cleanup(){

/* Call all exit functions */
<xsl:for-each select="gpu:xmodel/gpu:environment/gpu:exitFunctions/gpu:exitFunction">
<xsl:value-of select="gpu:name"/>();<xsl:text>
</xsl:text></xsl:for-each>

/* Agent data free*/
<xsl:for-each select="gpu:xmodel/xmml:xagents/gpu:xagent">
/* <xsl:value-of select="xmml:name"/> Agent variables */
Expand Down Expand Up @@ -455,6 +460,11 @@ void singleIteration(){
<xsl:value-of select="../../xmml:name"/>_<xsl:value-of select="xmml:name"/>(stream<xsl:value-of select="$stream_num"/>);
</xsl:for-each></xsl:for-each>cudaDeviceSynchronize();
</xsl:for-each>

/* Call all step functions */
<xsl:for-each select="gpu:xmodel/gpu:environment/gpu:stepFunctions/gpu:stepFunction">
<xsl:value-of select="gpu:name"/>();<xsl:text>
</xsl:text></xsl:for-each>
}

/* Environment functions */
Expand Down Expand Up @@ -496,6 +506,31 @@ int get_<xsl:value-of select="xmml:name"/>_population_width(){

</xsl:for-each>


/* Analytics Functions */

<xsl:for-each select="gpu:xmodel/xmml:xagents/gpu:xagent">
<xsl:variable name="agent_name" select="xmml:name"/>
<xsl:for-each select="xmml:states/gpu:state">
<xsl:variable name="state" select="xmml:name"/>
<xsl:for-each select="../../xmml:memory/gpu:variable">
<xsl:value-of select="xmml:type"/> reduce_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable(){
//reduce in default stream
return thrust::reduce(thrust::device_pointer_cast(d_<xsl:value-of select="$agent_name"/>s_<xsl:value-of select="$state"/>-><xsl:value-of select="xmml:name"/>), thrust::device_pointer_cast(d_<xsl:value-of select="$agent_name"/>s_<xsl:value-of select="$state"/>-><xsl:value-of select="xmml:name"/>) + h_xmachine_memory_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_count);
}

<xsl:if test="xmml:type='int'">
<xsl:value-of select="xmml:type"/> count_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_<xsl:value-of select="xmml:name"/>_variable(int count_value){
//count in default stream
return (int)thrust::count(thrust::device_pointer_cast(d_<xsl:value-of select="$agent_name"/>s_<xsl:value-of select="$state"/>-><xsl:value-of select="xmml:name"/>), thrust::device_pointer_cast(d_<xsl:value-of select="$agent_name"/>s_<xsl:value-of select="$state"/>-><xsl:value-of select="xmml:name"/>) + h_xmachine_memory_<xsl:value-of select="$agent_name"/>_<xsl:value-of select="$state"/>_count, count_value);
}
</xsl:if>

</xsl:for-each>
</xsl:for-each>
</xsl:for-each>


/* Agent functions */

<xsl:for-each select="gpu:xmodel/xmml:xagents/gpu:xagent/xmml:functions/gpu:function">
Expand Down
20 changes: 20 additions & 0 deletions examples/Analytics/Analytics.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Analytics", "Analytics.vcxproj", "{74309752-05AD-471A-B1A3-57EC7526402A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_Console|x64 = Debug_Console|x64
Release_Console|x64 = Release_Console|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{74309752-05AD-471A-B1A3-57EC7526402A}.Debug_Console|x64.ActiveCfg = Debug_Console|x64
{74309752-05AD-471A-B1A3-57EC7526402A}.Debug_Console|x64.Build.0 = Debug_Console|x64
{74309752-05AD-471A-B1A3-57EC7526402A}.Release_Console|x64.ActiveCfg = Release_Console|x64
{74309752-05AD-471A-B1A3-57EC7526402A}.Release_Console|x64.Build.0 = Release_Console|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
176 changes: 176 additions & 0 deletions examples/Analytics/Analytics.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug_Console|x64">
<Configuration>Debug_Console</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release_Console|x64">
<Configuration>Release_Console</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{74309752-05AD-471A-B1A3-57EC7526402A}</ProjectGuid>
<RootNamespace>Analytics_</RootNamespace>
<ProjectName>Analytics</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v120</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<FLAMEGPU_Template_Build_RuleAfterTargets>
</FLAMEGPU_Template_Build_RuleAfterTargets>
<CUDA_Build_RuleAfterTargets>_FLAMEGPU_Template_Build_Rule</CUDA_Build_RuleAfterTargets>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 7.0.props" />
<Import Project="../../tools/FLAMEGPU.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\..\bin\$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">
<OutDir>..\..\bin\$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);..\..\include;.\src;.\src\model;.\src\dynamic;.\src\visualisation;%(Include)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Console</SubSystem>
<AdditionalDependencies>cudart.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>../../lib/;%(AdditionalLibraryDirectories);$(CudaToolkitLibDir)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>echo copy "$(CudaToolkitBinDir)\cudart*.dll" "$(OutDir)"
copy "$(CudaToolkitBinDir)\cudart*.dll" "$(OutDir)"</Command>
</PostBuildEvent>
<CudaCompile>
<TargetMachinePlatform>64</TargetMachinePlatform>
<Include>..\..\include;.\src;.\src\model;.\src\dynamic;.\src\visualisation;%(Include)</Include>
<CodeGeneration>compute_20,sm_20;compute_30,sm_30;compute_35,sm_35;compute_50,sm_50</CodeGeneration>
<GPUDebugInfo>true</GPUDebugInfo>
<GenerateLineInfo>true</GenerateLineInfo>
<HostDebugInfo>true</HostDebugInfo>
<Runtime>MTd</Runtime>
</CudaCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PreprocessorDefinitions>WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(CudaToolkitIncludeDir);..\..\include;.\src;.\src\model;.\src\dynamic;.\src\visualisation;%(Include)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>false</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<SubSystem>Console</SubSystem>
<AdditionalDependencies>cudart.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>../../lib/;%(AdditionalLibraryDirectories);$(CudaToolkitLibDir)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>echo copy "$(CudaToolkitBinDir)\cudart*.dll" "$(OutDir)"
copy "$(CudaToolkitBinDir)\cudart*.dll" "$(OutDir)"</Command>
</PostBuildEvent>
<CudaCompile>
<TargetMachinePlatform>64</TargetMachinePlatform>
<Include>..\..\include;.\src;.\src\model;.\src\dynamic;.\src\visualisation;%(Include)</Include>
<CodeGeneration>compute_20,sm_20;compute_30,sm_30;compute_35,sm_35;compute_50,sm_50</CodeGeneration>
<Runtime>MT</Runtime>
<Defines>WIN32</Defines>
</CudaCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="src\dynamic\FLAMEGPU_kernals.cu">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
<FileType>Document</FileType>
</ClInclude>
<ClInclude Include="src\visualisation\visualisation.h" />
<ClInclude Include="XMML.h">
<DependentUpon>..\..\FLAMEGPU\schemas\XMML.xsd</DependentUpon>
</ClInclude>
<ClInclude Include="XMMLGPU.h">
<DependentUpon>..\..\FLAMEGPU\schemas\XMMLGPU.xsd</DependentUpon>
</ClInclude>
<CudaCompile Include="src\dynamic\io.cu" />
<CudaCompile Include="src\dynamic\main.cu" />
<CudaCompile Include="src\dynamic\simulation.cu" />
<CudaCompile Include="src\dynamic\visualisation.cu">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
</CudaCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\dynamic\header.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Text Include="src\dynamic\_README.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\model\functions.c">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Xml Include="..\..\FLAMEGPU\templates\FLAMEGPU_kernals.xslt" />
<Xml Include="..\..\FLAMEGPU\templates\header.xslt" />
<Xml Include="..\..\FLAMEGPU\templates\io.xslt" />
<Xml Include="..\..\FLAMEGPU\templates\main.xslt" />
<Xml Include="..\..\FLAMEGPU\templates\simulation.xslt" />
<Xml Include="..\..\FLAMEGPU\templates\visualisation.xslt" />
<FLAMEGPU_Template_Build_Rule Include="src\model\XMLModelFile.xml">
<SubType>Designer</SubType>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">false</ExcludedFromBuild>
</FLAMEGPU_Template_Build_Rule>
</ItemGroup>
<ItemGroup>
<Xsd Include="..\..\FLAMEGPU\schemas\XMML.xsd">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
</Xsd>
<Xsd Include="..\..\FLAMEGPU\schemas\XMMLGPU.xsd">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_Console|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_Console|x64'">true</ExcludedFromBuild>
</Xsd>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 7.0.targets" />
<Import Project="../../tools/FLAMEGPU.targets" />
</ImportGroup>
</Project>
Loading

0 comments on commit 4f9de4c

Please sign in to comment.