Program Listing for File curve_rtc.cuh
↰ Return to documentation for file (include/flamegpu/runtime/detail/curve/curve_rtc.cuh
)
#ifndef INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_RTC_CUH_
#define INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_RTC_CUH_
#include <driver_types.h>
#include <array>
#include <cstring>
#include <string>
#include <cstdio>
#include <typeindex>
#include <map>
#include <vector>
#include "flamegpu/util/StringPair.h"
namespace jitify {
namespace experimental {
class KernelInstantiation;
} // namespace experimental
} // namespace jitify
namespace flamegpu {
namespace detail {
namespace curve {
class CurveRTCHost {
public:
CurveRTCHost();
~CurveRTCHost();
void registerAgentVariable(const char* variableName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = true);
void registerMessageOutVariable(const char* variableName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = true);
void registerMessageInVariable(const char* variableName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = true);
void registerNewAgentVariable(const char* variableName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = true);
void registerEnvironmentDirectedGraphVertexProperty(const std::string& graphName, const std::string& propertyName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = false);
void registerEnvironmentDirectedGraphEdgeProperty(const std::string &graphName, const std::string &propertyName, const char* type, size_t type_size, unsigned int elements = 1, bool read = true, bool write = false);
void unregisterAgentVariable(const char* variableName);
void unregisterMessageOutVariable(const char* variableName);
void unregisterMessageInVariable(const char* variableName);
void unregisterNewAgentVariable(const char* variableName);
void unregisterEnvironmentDirectedGraphVertexProperty(const std::string& graphName, const std::string& propertyName);
void unregisterEnvironmentDirectedGraphEdgeProperty(const std::string& graphName, const std::string& propertyName);
void* getAgentVariableCachePtr(const char* variableName);
void* getMessageOutVariableCachePtr(const char* variableName);
void* getMessageInVariableCachePtr(const char* variableName);
void* getNewAgentVariableCachePtr(const char* variableName);
void* getEnvironmentDirectedGraphVertexPropertyCachePtr(const std::string& graphName, const std::string& propertyName);
void* getEnvironmentDirectedGraphEdgePropertyCachePtr(const std::string& graphName, const std::string& propertyName);
void setAgentVariableCount(const std::string& variableName, unsigned int count);
void setMessageOutVariableCount(const std::string& variableName, unsigned int count);
void setMessageInVariableCount(const std::string& variableName, unsigned int count);
void setNewAgentVariableCount(const std::string& variableName, unsigned int count);
void setEnvironmentDirectedGraphVertexPropertyCount(const std::string& graphName, const std::string& propertyName, unsigned int count);
void setEnvironmentDirectedGraphEdgePropertyCount(const std::string& graphName, const std::string& propertyName, unsigned int count);
void registerEnvVariable(const char* propertyName, ptrdiff_t offset, const char* type, size_t type_size, unsigned int elements = 1);
void unregisterEnvVariable(const char* propertyName);
void registerEnvMacroProperty(const char* propertyName, void* d_ptr, const char* type, size_t type_size, const std::array<unsigned int, 4>& dimensions);
void unregisterEnvMacroProperty(const char* propertyName);
void registerAgent(const std::string &agentName, const std::string &agentState);
void setFileName(const std::string& filename);
std::string getDynamicHeader(size_t env_buffer_len);
static std::string getVariableSymbolName();
static std::string demangle(const char* verbose_name);
static std::string demangle(const std::type_index& type);
void updateEnvCache(const void* d_env_ptr, const size_t bufferLen);
void updateDevice_async(const jitify::experimental::KernelInstantiation& instance, cudaStream_t stream);
protected:
void setHeaderPlaceholder(std::string placeholder, std::string dst);
struct RTCVariableProperties {
std::string type;
bool read;
bool write;
unsigned int elements;
size_t type_size;
void *h_data_ptr;
unsigned int count_index;
};
struct RTCEnvVariableProperties {
std::string type;
unsigned int elements;
ptrdiff_t offset;
size_t type_size;
};
struct RTCEnvMacroPropertyProperties {
std::string type;
std::array<unsigned int, 4> dimensions;
size_t type_size;
void* d_ptr;
void* h_data_ptr;
};
private:
void initHeaderEnvironment(size_t env_buffer_len);
void initHeaderSetters();
void initHeaderGetters();
void initDataBuffer();
std::string header;
static const char* curve_rtc_dynamic_h_template;
size_t agent_data_offset = 0;
size_t messageOut_data_offset = 0;
size_t messageIn_data_offset = 0;
size_t newAgent_data_offset = 0;
size_t directedGraphVertex_data_offset = 0;
size_t directedGraphEdge_data_offset = 0;
size_t envMacro_data_offset = 0;
size_t count_data_offset = 0;
size_t data_buffer_size = 0;
char * h_data_buffer = nullptr;
std::map<std::string, RTCVariableProperties> agent_variables;
std::map<std::string, RTCVariableProperties> messageOut_variables;
std::map<std::string, RTCVariableProperties> messageIn_variables;
std::map<std::string, RTCVariableProperties> newAgent_variables;
util::StringPairMap<RTCVariableProperties> directedGraph_vertexProperties;
util::StringPairMap<RTCVariableProperties> directedGraph_edgeProperties;
std::map<std::string, RTCEnvVariableProperties> RTCEnvVariables;
std::map<std::string, RTCEnvMacroPropertyProperties> RTCEnvMacroProperties;
std::vector<unsigned int> count_buffer;
std::string agentName;
std::string agentState;
};
} // namespace curve
} // namespace detail
} // namespace flamegpu
#endif // INCLUDE_FLAMEGPU_RUNTIME_DETAIL_CURVE_CURVE_RTC_CUH_