2022-02-11 09:07:11 +11:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2021-09-09 12:54:20 +02:00
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
|
* \ingroup fn
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "FN_multi_function_procedure.hh"
|
|
|
|
|
|
2023-01-07 17:32:28 +01:00
|
|
|
namespace blender::fn::multi_function {
|
2021-09-09 12:54:20 +02:00
|
|
|
|
|
|
|
|
/** A multi-function that executes a procedure internally. */
|
2023-01-07 17:32:28 +01:00
|
|
|
class ProcedureExecutor : public MultiFunction {
|
2021-09-09 12:54:20 +02:00
|
|
|
private:
|
2023-01-07 17:32:28 +01:00
|
|
|
Signature signature_;
|
|
|
|
|
const Procedure &procedure_;
|
2021-09-09 12:54:20 +02:00
|
|
|
|
|
|
|
|
public:
|
2023-01-07 17:32:28 +01:00
|
|
|
ProcedureExecutor(const Procedure &procedure);
|
2021-09-09 12:54:20 +02:00
|
|
|
|
2023-01-14 15:42:52 +01:00
|
|
|
void call(IndexMask mask, Params params, Context context) const override;
|
Geometry Nodes: refactor multi-threading in field evaluation
Previously, there was a fixed grain size for all multi-functions. That was
not sufficient because some functions could benefit a lot from smaller
grain sizes.
This refactors adds a new `MultiFunction::call_auto` method which has the
same effect as just calling `MultiFunction::call` but additionally figures
out how to execute the specific multi-function efficiently. It determines
a good grain size and decides whether the mask indices should be shifted
or not.
Most multi-function evaluations benefit from this, but medium sized work
loads (1000 - 50000 elements) benefit from it the most. Especially when
expensive multi-functions (e.g. noise) is involved. This is because for
smaller work loads, threading is rarely used and for larger work loads
threading worked fine before already.
With this patch, multi-functions can specify execution hints, that allow
the caller to execute it most efficiently. These execution hints still
have to be added to more functions.
Some performance measurements of a field evaluation involving noise and
math nodes, ordered by the number of elements being evaluated:
```
1,000,000: 133 ms -> 120 ms
100,000: 30 ms -> 18 ms
10,000: 20 ms -> 2.7 ms
1,000: 4 ms -> 0.5 ms
100: 0.5 ms -> 0.4 ms
```
2021-11-26 11:05:47 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
ExecutionHints get_execution_hints() const override;
|
2021-09-09 12:54:20 +02:00
|
|
|
};
|
|
|
|
|
|
2023-01-07 17:32:28 +01:00
|
|
|
} // namespace blender::fn::multi_function
|