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

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

我想在提拉米苏编译器上测试用卤化物编写的算法
有一次我 运行 我得到了这样的错误

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

所以我决定只测试方法的调用,即使我有相同的参数,但我得到相同的错误或类似的错误

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

这是我的 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

这是我的 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;
}

这里是我调用 vgg_ref 方法的包装器

...

#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" << ": ";
    */
}

我注意到一旦我在 halide 部分评论了这一行,一切都很好

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

所以 问题出在 halide 函数的调用中 "vgg_ref" .

但我不知道这个错误与我试图只调用一个参数的内容有关,我总是遇到同样的问题。我不知道如何解决它。

感谢您分享任何建议或关注某些事情。 谢谢。

AlhamduAllah 我后来已经解决了这个问题。

我想在这里注意,如果没有创建 ".o"" 文件,就不可能 运行 基准测试

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

但我的情况是 运行 是怎么回事!!!

好吧,这主要是因为“.o”文件是在上一次执行的某处生成的。

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.

即使我后来注意了,我仍然有同样的错误或类似的错误:(。

这个错误指的是什么?这通常意味着在您的代码中,它们是一个索引,不符合包装器中的定义。

因此,这里有两 (02) 件事情需要验证以帮助解决此问题:

  • 验证函数的调用,它的参数:ex如果函数需要放5个参数验证你放5不多不少。
  • 验证所有索引的间隔。

我的问题出在这两行

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

RDom(迭代的多维域。)帮助您浏览输入矩阵中的小矩阵,如对输入应用过滤器。上面这个RDom定义了过滤矩阵的x,y,z的区间。

在包装器中,我像这样定义过滤器的参数

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

所以在 RDom 中我也必须把 x 从 0 变化到 k+1 但我只有 k 这就是为什么我得到了问题中显示的那个问题。

所以应该这样做

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

这确实解决了我的问题。

因此,请注意那些可能毁了你一天的小错误,但没关系,因为它会帮助你了解更多信息。