Search code examples
halide

Error: Input buffer filter is accessed at 63, which is beyond the max (15) in dimension 2 Aborted (core dumped)


I want to test my algorithm written in halide on tiramisu compiler
once i run it i got an error like this one

Error: Input buffer filter is accessed at 63, which is beyond the max (15) in dimension 2
Aborted (core dumped)

So i decided to only test the call of the method even i have same parameter but i get same error or error similar like

Error: Input buffer bias is accessed at 15, which is beyond the max (4) in dimension 0
Aborted (core dumped)

here is my wrapper_vgg.h

    #ifndef HALIDE__build___wrapper_vgg_o_h
    #define HALIDE__build___wrapper_vgg_o_h

    #include <tiramisu/utils.h>

    #define RADIUS 3

    #ifdef __cplusplus
    extern "C" {
    #endif

    int vgg_tiramisu(halide_buffer_t *, halide_buffer_t *_b_input_buffer ,halide_buffer_t *filter,halide_buffer_t *bias,halide_buffer_t *conv,halide_buffer_t *filter2, halide_buffer_t *bias2 ,halide_buffer_t *conv2,halide_buffer_t *_b_output_buffer,halide_buffer_t *_negative_slope);
    int vgg_tiramisu_argv(void **args);


    int vgg_ref( halide_buffer_t *_b_input_buffer ,halide_buffer_t *filter,halide_buffer_t *bias,halide_buffer_t *filter2, halide_buffer_t *bias2 ,halide_buffer_t *_b_output_buffer);
    int vgg_ref_argv(void **args);

    // Result is never null and points to constant static data
    const struct halide_filter_metadata_t *vgg_tiramisu_metadata();
    const struct halide_filter_metadata_t *vgg_ref_metadata();

    #ifdef __cplusplus
    }  // extern "C"
    #endif

and here is my vgg_ref.cpp

#include "Halide.h"
#include "configure.h"

using namespace Halide;
int main(int argc, char **argv)
{ 
    ImageParam            input{Float(32), 4, "input"};
    ImageParam            filter{Float(32), 4, "filter"};
    ImageParam            bias{Float(32), 1, "bias"};
    ImageParam            filter2{Float(32), 4, "filter2"};
    ImageParam            bias2{Float(32), 1, "bias2"};
   /* THE ALGORITHM */

    Var x("x"), y("y"), z("z"), n("n");
    Func f_conv("conv"), f_conv2("conv2");
    Func f_ReLU("ReLU"), f_ReLU2("ReLU2") ;
    //Func f_Maxpool("Maxpool");
    Func f_vgg("vgg");

    RDom r(0, K+1, 0, K+1, 0, FIn);
    RDom r2(0, K+1, 0, K+1, 0, FOut);

    // First conv computations
    f_conv(x, y, z, n) = bias(z);
    f_conv(x, y, z, n) += filter(r.x, r.y, r.z, z) * input(x + r.x, y + r.y, r.z, n);

    //first relu
     f_ReLU(x, y, z, n) = max(0, f_conv(x, y, z, n));

        .....
        .....

    /* THE SCHEDULE */
     // Provide estimates on the input image
        .....
        .....


    f_vgg.compile_to_object("build/generated_fct_vgg_ref.o", {input, filter, bias, filter2, bias2}, "vgg_ref");
    f_vgg.compile_to_lowered_stmt("build/generated_fct_vgg_ref.txt", {input, filter, bias, filter2, bias2}, Text);

    return 0;
}

and here is the wrapper where i call vgg_ref method

...

#include "configure.h"
#include "wrapper_vgg.h"
#include <tiramisu/utils.h>
using namespace std;

int main(int, char**)
{
    Halide::Buffer<float> input(N+K, N+K, FIn, BATCH_SIZE);
    Halide::Buffer<float> filter(K+1, K+1, FIn, FOut);
    Halide::Buffer<float> bias(FOut);
    Halide::Buffer<float> conv(N, N, FOut, BATCH_SIZE);
    Halide::Buffer<float> filter2(K+1, K+1, FOut, FOut);
    Halide::Buffer<float> bias2(FOut);
    Halide::Buffer<float> conv2_tiramisu(N-K, N-K, FOut, BATCH_SIZE);
    Halide::Buffer<float> vgg_tiramisu_buff(N-2*K, N-2*K, FOut, BATCH_SIZE);
    Halide::Buffer<int> parameters(5);
    Halide::Buffer<float> negative_slope(1);negative_slope(0) = 1;
    // Buffer for Halide 
    Halide::Buffer<float> vgg_halide(N-2*K, N-2*K, FOut, BATCH_SIZE);

    std::vector<std::chrono::duration<double,std::milli>> duration_vector_1;
    std::vector<std::chrono::duration<double,std::milli>> duration_vector_2;

    /****************************************** Initialize Buffers *********************************************/
    ....
    ....
    ....

    std::cout << "\t\tBuffers initialized" << std::endl;

    /****************************************** Halide Part ********************************************************/

   for (int i=0; i<NB_TESTS; i++)
    {

        auto start1 = std::chrono::high_resolution_clock::now();
        vgg_ref(input.raw_buffer(), filter.raw_buffer(), bias.raw_buffer(), filter2.raw_buffer(), bias2.raw_buffer(), vgg_halide.raw_buffer());

        auto end1 = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double,std::milli> duration = end1 - start1;
        duration_vector_2.push_back(duration);
    }

    std::cout << "\t\tHalide vgg duration" << ": " << median(duration_vector_1)/1000 << "; " << std::endl;
    std::cout << "\t\t Result" << ": ";

    /****************************************** Tiramisu Part ********************************************************/

   /* // Initialize parameters[]
    parameters(0) = N;
    parameters(1) = K;
    parameters(2) = FIn;
    parameters(3) = FOut;
    parameters(4) = BATCH_SIZE;


    for (int i=0; i<NB_TESTS; i++)
    {
       // srand (1);
        auto start1 = std::chrono::high_resolution_clock::now();
        vgg_tiramisu(parameters.raw_buffer(), input.raw_buffer(), filter.raw_buffer(), bias.raw_buffer(), conv.raw_buffer(), filter2.raw_buffer(), bias2.raw_buffer(), conv2_tiramisu.raw_buffer(),vgg_tiramisu_buff.raw_buffer(),negative_slope.raw_buffer());

        auto end1 = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double,std::milli> duration = end1 - start1;
        duration_vector_1.push_back(duration);
    }

    std::cout << "\t\tTiramisu vgg duration" << ": " << median(duration_vector_2)/1000 << "; " << std::endl;
    std::cout << "\t\t Result" << ": ";
    */
}

i noticed that once i comment this line in halide part everything work well

  vgg_ref(input.raw_buffer(), filter.raw_buffer(), bias.raw_buffer(), filter2.raw_buffer(), bias2.raw_buffer(), vgg_halide.raw_buffer());

so the problem is in this call of the halide function "vgg_ref" .

but i do not know this error related to what i tried to call only one parameter i do always have same problem. i do not know how to fix it.

thank you for sharing any advice or paying my attention to something. Thank you.


Solution

  • I have been able to fix the problem later AlhamduAllah.

    I wanna pay the attention here that it's impossible to be able to run the benchmarks without creating the ".o" file so without this line

     f_vgg.compile_to_object("build/generated_fct_vgg_ref.o", {input, filter, bias, filter2, bias2}, "vgg_ref");
    

    But how it comes that it was run in my case!!!

    Ok this is basically because ".o" file was generated somewhere in the previous execution.

    Be careful here :The trick of the old ".o" should be a reflex many issues of the false result is due to the existence of an old copy that object file.

    Even I pay attention for that later, I still have same error or error similar :(.

    What does this error refer to ? it mean generally in your code their is an index that does not mach it's definition in the wrapper.

    So here is two (02) things to verify to help fix this issue:

    • Verify the call of the function, it's parameter : ex if the function require put 5 parameter verify if you put 5 not more not less.
    • Verify all the index their interval.

    My problem was in this 2 lines

    RDom r(0, K, 0, K, 0, FIn);
    RDom r2(0, K, 0, K, 0, FOut);
    

    RDom (A multi-dimensional domain over which to iterate.) help you to browse a small matrix in the input matrix like apply a filter for the input. This RDom above define the intervals of x, y and z of the filter matrix.

    In the wrapper i define the parameter of the filter like this

     Halide::Buffer<float> filter(K+1, K+1, FIn, FOut);
    

    So in RDom too i have to put that x varies from 0 to k+1 but i have only k that's why i got that problem shown in the question.

    So it should be done like this

    RDom r(0, K+1, 0, K+1, 0, FIn);
    RDom r2(0, K+1, 0, K+1, 0, FOut);
    

    And that do fix my problem.

    So just pay attention to those small errors that may ruins your day but it's ok since it will help you learn more.