[Bf-blender-cvs] [dbc8b52752c] temp-llvm-testing: test using compiled function in math node
Jacques Lucke
noreply at git.blender.org
Sun Jan 2 20:46:13 CET 2022
Commit: dbc8b52752c24fd40965e98cf13be1d0e6953bb2
Author: Jacques Lucke
Date: Sun Jan 2 20:46:01 2022 +0100
Branches: temp-llvm-testing
https://developer.blender.org/rBdbc8b52752c24fd40965e98cf13be1d0e6953bb2
test using compiled function in math node
===================================================================
M source/blender/functions/FN_llvm.hh
M source/blender/functions/intern/llvm.cc
M source/blender/modifiers/intern/MOD_nodes.cc
M source/blender/nodes/shader/nodes/node_shader_math.cc
===================================================================
diff --git a/source/blender/functions/FN_llvm.hh b/source/blender/functions/FN_llvm.hh
index 2d02af906b0..417719a21b5 100644
--- a/source/blender/functions/FN_llvm.hh
+++ b/source/blender/functions/FN_llvm.hh
@@ -18,6 +18,8 @@
namespace blender::fn {
-void playground();
+using AddFuncType = void (*)(const float *, float, float *, int);
-}
+AddFuncType get_compiled_add_function();
+
+} // namespace blender::fn
diff --git a/source/blender/functions/intern/llvm.cc b/source/blender/functions/intern/llvm.cc
index c52abf56228..324f9f3bad6 100644
--- a/source/blender/functions/intern/llvm.cc
+++ b/source/blender/functions/intern/llvm.cc
@@ -99,98 +99,113 @@ static llvm::Function &create_add_loop_function(llvm::Module &module)
return function;
}
-void playground()
-{
- std::cout << "Start\n";
+class FunctionOptimizer {
+ private:
+ llvm::LLVMContext context_;
+ std::unique_ptr<llvm::ExecutionEngine> execution_engine_;
+
+ public:
+ AddFuncType generated_function;
- static bool initialized = []() {
- /* Set assembly syntax flavour. */
+ public:
+ void initialize()
+ {
char const *args[] = {"some-random-name-for-the-parser", "--x86-asm-syntax=intel"};
llvm::cl::ParseCommandLineOptions(std::size(args), args);
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
llvm::InitializeNativeTargetAsmParser();
- return true;
- }();
- UNUSED_VARS(initialized);
-
- llvm::LLVMContext context;
-
- std::unique_ptr<llvm::Module> module = std::make_unique<llvm::Module>("My Module", context);
- llvm::Module *module_ptr = &*module;
- std::string error;
- const llvm::Target *target = llvm::TargetRegistry::lookupTarget(
- llvm::sys::getDefaultTargetTriple(), error);
- llvm::TargetOptions target_options;
- llvm::StringMap<bool> cpu_feature_map;
- llvm::sys::getHostCPUFeatures(cpu_feature_map);
- llvm::SubtargetFeatures subtarget_features;
- for (const auto &item : cpu_feature_map) {
- subtarget_features.AddFeature(item.getKey(), item.getValue());
}
- llvm::TargetMachine *target_machine = target->createTargetMachine(
- llvm::sys::getDefaultTargetTriple(),
- llvm::sys::getHostCPUName().str(),
- subtarget_features.getString(),
- target_options,
- {},
- {},
- llvm::CodeGenOpt::Aggressive);
-
- module->setDataLayout(target_machine->createDataLayout());
- module->setTargetTriple(target_machine->getTargetTriple().normalize());
- std::cout << "Target Feature: " << target_machine->getTargetFeatureString().str() << "\n";
- std::cout << "CPU: " << target_machine->getTargetCPU().str() << "\n";
-
- std::cout << module->getTargetTriple() << "\n";
- std::cout << module->getDataLayout().getStringRepresentation() << "\n";
-
- llvm::Function &add_function = create_add_loop_function(*module);
-
- BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
- add_function.print(llvm::outs());
-
- llvm::LoopAnalysisManager loop_analysis_manager;
- llvm::FunctionAnalysisManager function_analysis_manager;
- llvm::CGSCCAnalysisManager cgscc_anaylysis_manager;
- llvm::ModuleAnalysisManager module_analysis_manager;
-
- llvm::PassBuilder pass_builder{false, target_machine};
-
- function_analysis_manager.registerPass([&] { return pass_builder.buildDefaultAAPipeline(); });
-
- pass_builder.registerModuleAnalyses(module_analysis_manager);
- pass_builder.registerCGSCCAnalyses(cgscc_anaylysis_manager);
- pass_builder.registerFunctionAnalyses(function_analysis_manager);
- pass_builder.registerLoopAnalyses(loop_analysis_manager);
- pass_builder.crossRegisterProxies(loop_analysis_manager,
- function_analysis_manager,
- cgscc_anaylysis_manager,
- module_analysis_manager);
-
- llvm::ModulePassManager module_pass_manager = pass_builder.buildPerModuleDefaultPipeline(
- llvm::PassBuilder::OptimizationLevel::O3);
-
- module_pass_manager.run(*module, module_analysis_manager);
-
- add_function.print(llvm::outs());
-
- llvm::EngineBuilder engine_builder{std::move(module)};
- engine_builder.setOptLevel(llvm::CodeGenOpt::Aggressive);
- std::unique_ptr<llvm::ExecutionEngine> ee{engine_builder.create(target_machine)};
- ee->finalizeObject();
-
- const uint64_t function_ptr = ee->getFunctionAddress(add_function.getName().str());
- using FuncType = void (*)(const float *, float, float *, int);
- const FuncType generated_function = (FuncType)function_ptr;
- UNUSED_VARS(generated_function, module_ptr);
-
- LLVMTargetMachineEmitToFile((LLVMTargetMachineRef)ee->getTargetMachine(),
- llvm::wrap(module_ptr),
- (char *)"C:\\Users\\jacques\\Documents\\machine_code.txt",
- LLVMAssemblyFile,
- nullptr);
+
+ void generate_function()
+ {
+ std::unique_ptr<llvm::Module> module_owned = std::make_unique<llvm::Module>("My Module",
+ context_);
+ llvm::Module &ir_module = *module_owned;
+ std::string error;
+ const llvm::Target *target = llvm::TargetRegistry::lookupTarget(
+ llvm::sys::getDefaultTargetTriple(), error);
+ llvm::TargetOptions target_options;
+ llvm::StringMap<bool> cpu_feature_map;
+ llvm::sys::getHostCPUFeatures(cpu_feature_map);
+ llvm::SubtargetFeatures subtarget_features;
+ for (const auto &item : cpu_feature_map) {
+ subtarget_features.AddFeature(item.getKey(), item.getValue());
+ }
+ llvm::TargetMachine *target_machine = target->createTargetMachine(
+ llvm::sys::getDefaultTargetTriple(),
+ llvm::sys::getHostCPUName().str(),
+ subtarget_features.getString(),
+ target_options,
+ {},
+ {},
+ llvm::CodeGenOpt::Aggressive);
+
+ ir_module.setDataLayout(target_machine->createDataLayout());
+ ir_module.setTargetTriple(target_machine->getTargetTriple().normalize());
+
+ std::cout << ir_module.getTargetTriple() << "\n";
+ std::cout << ir_module.getDataLayout().getStringRepresentation() << "\n";
+
+ llvm::Function &add_function = create_add_loop_function(ir_module);
+
+ BLI_assert(!llvm::verifyModule(ir_module, &llvm::outs()));
+ add_function.print(llvm::outs());
+
+ llvm::LoopAnalysisManager loop_analysis_manager;
+ llvm::FunctionAnalysisManager function_analysis_manager;
+ llvm::CGSCCAnalysisManager cgscc_anaylysis_manager;
+ llvm::ModuleAnalysisManager module_analysis_manager;
+
+ llvm::PassBuilder pass_builder{false, target_machine};
+
+ function_analysis_manager.registerPass([&] { return pass_builder.buildDefaultAAPipeline(); });
+
+ pass_builder.registerModuleAnalyses(module_analysis_manager);
+ pass_builder.registerCGSCCAnalyses(cgscc_anaylysis_manager);
+ pass_builder.registerFunctionAnalyses(function_analysis_manager);
+ pass_builder.registerLoopAnalyses(loop_analysis_manager);
+ pass_builder.crossRegisterProxies(loop_analysis_manager,
+ function_analysis_manager,
+ cgscc_anaylysis_manager,
+ module_analysis_manager);
+
+ llvm::ModulePassManager module_pass_manager = pass_builder.buildPerModuleDefaultPipeline(
+ llvm::PassBuilder::OptimizationLevel::O3);
+
+ module_pass_manager.run(ir_module, module_analysis_manager);
+
+ add_function.print(llvm::outs());
+
+ llvm::EngineBuilder engine_builder{std::move(module_owned)};
+ engine_builder.setOptLevel(llvm::CodeGenOpt::Aggressive);
+ execution_engine_ = std::unique_ptr<llvm::ExecutionEngine>(
+ engine_builder.create(target_machine));
+ execution_engine_->finalizeObject();
+
+ const uint64_t function_ptr = execution_engine_->getFunctionAddress(
+ add_function.getName().str());
+
+ this->generated_function = (AddFuncType)function_ptr;
+
+ LLVMTargetMachineEmitToFile((LLVMTargetMachineRef)target_machine,
+ llvm::wrap(&ir_module),
+ (char *)"C:\\Users\\jacques\\Documents\\machine_code.txt",
+ LLVMAssemblyFile,
+ nullptr);
+ }
+};
+
+AddFuncType get_compiled_add_function()
+{
+ static FunctionOptimizer *optimizer = []() {
+ static FunctionOptimizer optimizer;
+ optimizer.initialize();
+ optimizer.generate_function();
+ return &optimizer;
+ }();
+ return optimizer->generated_function;
}
} // namespace blender::fn
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index a52fc2703db..592bdc5e2ae 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -1109,7 +1109,6 @@ static void modifyGeometry(ModifierData *md,
const ModifierEvalContext *ctx,
GeometrySet &geometry_set)
{
- blender::fn::playground();
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
if (nmd->node_group == nullptr) {
return;
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.cc b/source/blender/nodes/shader/nodes/node_shader_math.cc
index e683d55edc8..7d7408d90f8 100644
--- a/source/blender/nodes/shader/nodes/node_shader_math.cc
+++ b/source/blender/nodes/shader/nodes/node_shader_math.cc
@@ -26,6 +26,8 @@
#include "NOD_math_functions.hh"
#include "NOD_socket_search_link.hh"
+#include "FN_llvm.hh"
+
/* **************** SCALAR MATH ******************** */
namespace blender::nodes::node_shader_math_cc {
@@ -92,9 +94,67 @@ static int gpu_shader_math(GPUMaterial *mat,
return 0;
}
+class AddMultiFunction : public MultiFunction {
+ bool use_compiled_;
+
+ public:
+ AddMultiFunction(bool use_compiled) : use_compiled_(use_compiled)
+ {
+ static fn::MFSignature signature = create_signature();
+ this->set_signature(&signature);
+ }
+
+ static fn::MFSignature create_signature()
+ {
+ fn::MFSignatureBuilder signature{"Add"};
+ signature.single_input<float>("A");
+ signature.single_i
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list