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

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

parent 1459f3ef
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