Commit 76161064 authored by Cianciosa, Mark's avatar Cianciosa, Mark
Browse files

Merge branch 'index' into 'main'

Refactor piecewise indexing to use the smallest integer type to allieviate register pressure.

See merge request !51
parents 1459f3ef b869b343
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -603,19 +603,23 @@ namespace graph {
///
///  @param[in,out] stream    String buffer stream.
///  @param[in,out] registers List of defined registers.
///  @param[in,out] indices   List of defined indices.
///  @param[in]     usage     List of register usage count.
///  @returns The current node.
//------------------------------------------------------------------------------
        virtual shared_leaf<T, SAFE_MATH>
        compile(std::ostringstream &stream,
                jit::register_map &registers,
                jit::register_map &indices,
                const jit::register_usage &usage) {
            if (registers.find(this) == registers.end()) {
                shared_leaf<T, SAFE_MATH> l = this->left->compile(stream, 
                                                                  registers,
                                                                  indices,
                                                                  usage);
                shared_leaf<T, SAFE_MATH> r = this->right->compile(stream,
                                                                   registers,
                                                                   indices,
                                                                   usage);

                registers[this] = jit::to_string('r', this);
@@ -1428,19 +1432,23 @@ namespace graph {
///
///  @param[in,out] stream    String buffer stream.
///  @param[in,out] registers List of defined registers.
///  @param[in,out] indices   List of defined indices.
///  @param[in]     usage     List of register usage count.
///  @returns The current node.
//------------------------------------------------------------------------------
        virtual shared_leaf<T, SAFE_MATH>
        compile(std::ostringstream &stream,
                jit::register_map &registers,
                jit::register_map &indices,
                const jit::register_usage &usage) {
            if (registers.find(this) == registers.end()) {
                shared_leaf<T, SAFE_MATH> l = this->left->compile(stream, 
                                                                  registers,
                                                                  indices,
                                                                  usage);
                shared_leaf<T, SAFE_MATH> r = this->right->compile(stream,
                                                                   registers,
                                                                   indices,
                                                                   usage);

                registers[this] = jit::to_string('r', this);
@@ -2288,19 +2296,23 @@ namespace graph {
///
///  @param[in,out] stream    String buffer stream.
///  @param[in,out] registers List of defined registers.
///  @param[in,out] indices   List of defined indices.
///  @param[in]     usage     List of register usage count.
///  @returns The current node.
//------------------------------------------------------------------------------
        virtual shared_leaf<T, SAFE_MATH>
        compile(std::ostringstream &stream,
                jit::register_map &registers,
                jit::register_map &indices,
                const jit::register_usage &usage) {
            if (registers.find(this) == registers.end()) {
                shared_leaf<T, SAFE_MATH> l = this->left->compile(stream,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                shared_leaf<T, SAFE_MATH> r = this->right->compile(stream,
                                                                   registers,
                                                                   indices,
                                                                   usage);

                registers[this] = jit::to_string('r', this);
@@ -3262,19 +3274,23 @@ namespace graph {
///
///  @param[in,out] stream    String buffer stream.
///  @param[in,out] registers List of defined registers.
///  @param[in,out] indices   List of defined indices.
///  @param[in]     usage     List of register usage count.
///  @returns The current node.
//------------------------------------------------------------------------------
        virtual shared_leaf<T, SAFE_MATH>
        compile(std::ostringstream &stream,
                jit::register_map &registers,
                jit::register_map &indices,
                const jit::register_usage &usage) {
            if (registers.find(this) == registers.end()) {
                shared_leaf<T, SAFE_MATH> l = this->left->compile(stream,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                shared_leaf<T, SAFE_MATH> r = this->right->compile(stream,
                                                                   registers,
                                                                   indices,
                                                                   usage);

                registers[this] = jit::to_string('r', this);
@@ -4654,22 +4670,27 @@ namespace graph {
///
///  @param[in,out] stream    String buffer stream.
///  @param[in,out] registers List of defined registers.
///  @param[in,out] indices   List of defined indices.
///  @param[in]     usage     List of register usage count.
///  @returns The current node.
//------------------------------------------------------------------------------
        virtual shared_leaf<T, SAFE_MATH>
        compile(std::ostringstream &stream,
                jit::register_map &registers,
                jit::register_map &indices,
                const jit::register_usage &usage) {
            if (registers.find(this) == registers.end()) {
                shared_leaf<T, SAFE_MATH> l = this->left->compile(stream,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                shared_leaf<T, SAFE_MATH> m = this->middle->compile(stream,
                                                                    registers,
                                                                    indices,
                                                                    usage);
                shared_leaf<T, SAFE_MATH> r = this->right->compile(stream,
                                                                   registers,
                                                                   indices,
                                                                   usage);

                registers[this] = jit::to_string('r', this);
+4 −0
Original line number Diff line number Diff line
@@ -449,16 +449,19 @@ namespace gpu {
///  @param[in]     outputs       Output nodes of the graph to compute.
///  @param[in]     setters       Map outputs back to input values.
///  @param[in,out] registers     Map of used registers.
///  @param[in,out] indices       Map of used indices.
///  @param[in]     usage         List of register usage count.
//------------------------------------------------------------------------------
        void create_kernel_postfix(std::ostringstream &source_buffer,
                                   graph::output_nodes<T, SAFE_MATH> &outputs,
                                   graph::map_nodes<T, SAFE_MATH> &setters,
                                   jit::register_map &registers,
                                   jit::register_map &indices,
                                   const jit::register_usage &usage) {
            for (auto &[out, in] : setters) {
                graph::shared_leaf<T, SAFE_MATH> a = out->compile(source_buffer,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                source_buffer << "        " << jit::to_string('v', in.get());
                source_buffer << "[i] = ";
@@ -484,6 +487,7 @@ namespace gpu {
            for (auto &out : outputs) {
                graph::shared_leaf<T, SAFE_MATH> a = out->compile(source_buffer,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                source_buffer << "        " << jit::to_string('o', out.get());
                source_buffer << "[i] = ";
+3 −0
Original line number Diff line number Diff line
@@ -739,6 +739,7 @@ namespace gpu {
///  @param[in]     outputs       Output nodes of the graph to compute.
///  @param[in]     setters       Map outputs back to input values.
///  @param[in,out] registers     Map of used registers.
///  @param[in,out] indices       Map of used indices.
///  @param[in]     usage         List of register usage count.
//------------------------------------------------------------------------------
        void create_kernel_postfix(std::ostringstream &source_buffer,
@@ -749,6 +750,7 @@ namespace gpu {
            for (auto &[out, in] : setters) {
                graph::shared_leaf<T, SAFE_MATH> a = out->compile(source_buffer,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                source_buffer << "        " << jit::to_string('v',  in.get())
                              << "[index] = ";
@@ -775,6 +777,7 @@ namespace gpu {
            for (auto &out : outputs) {
                graph::shared_leaf<T, SAFE_MATH> a = out->compile(source_buffer,
                                                                  registers,
                                                                  indices,
                                                                  usage);
                source_buffer << "        " << jit::to_string('o',  out.get())
                              << "[index] = ";
+3 −3
Original line number Diff line number Diff line
@@ -905,7 +905,7 @@ namespace dispersion {
            auto ne = eq->get_electron_density(x, y, z);
            auto te = eq->get_electron_temperature(x, y, z);

            auto ve = graph::sqrt(2.0*physics<T, SAFE_MATH>::q*te /
            auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
                                  physics<T, SAFE_MATH>::me)
                    / physics<T, SAFE_MATH>::c;

@@ -1009,7 +1009,7 @@ namespace dispersion {
            auto ne = eq->get_electron_density(x, y, z);
            auto te = eq->get_electron_temperature(x, y, z);
            
            auto ve = graph::sqrt(2.0*physics<T, SAFE_MATH>::q*te /
            auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
                                  physics<T, SAFE_MATH>::me)
                    / physics<T, SAFE_MATH>::c;

@@ -1122,7 +1122,7 @@ namespace dispersion {
            auto ne = eq->get_electron_density(x, y, z);
            auto te = eq->get_electron_temperature(x, y, z);

            auto ve = graph::sqrt(2.0*physics<T, SAFE_MATH>::q*te /
            auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
                                  physics<T, SAFE_MATH>::me);

//  Setup characteristic frequencies.
+5 −3
Original line number Diff line number Diff line
@@ -144,15 +144,17 @@ namespace jit {
                                             kernel_1dtextures[name],
                                             kernel_2dtextures[name]);

            register_map indices;
            for (auto &[out, in] : setters) {
                out->compile(source_buffer, registers, usage);
                out->compile(source_buffer, registers, indices, usage);
            }
            for (auto &out : outputs) {
                out->compile(source_buffer, registers, usage);
                out->compile(source_buffer, registers, indices, usage);
            }

            gpu_context.create_kernel_postfix(source_buffer, outputs,
                                              setters, registers, usage);
                                              setters, registers, indices,
                                              usage);

//  Delete the registers so that they can be used again in other kernels.
            std::vector<void *> removed_elements;
Loading