标签: halide

Halide - while循环等效

我正在尝试在Halide中实现Meijster距离变换算法.我已经将此代码重写为C++(使用openCV)并且它工作正常.关于这个算法的论文就在这里.现在我的卤化物代码已完成50% - 第一阶段工作正常,现在我遇到了阶段2(链接代码中的扫描3)的问题,其中(简化)看起来像这样:

//g is 2 dimensional cv::Mat (something like array) - result of previous stage
// m is g.width and n is g.height
int(*functionF)(int x, int i, int g_i) = EDT_f;
int(*functionSep)(int i, int u, int g_i, int g_u, int max_value) = EDT_Sep;
cv::Mat dt = cv::Mat(n, m, CV_32SC1);
int* s = new int[m];
int* t = new int[m];
int q = 0, w;

for (int y = 0; y<n; y++)
{
    q = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing while-loop halide

6
推荐指数
1
解决办法
914
查看次数

推荐的方式来分发Halide生成的函数?

我目前正在尝试使用Halide,初步测试显示出非常有前景的性能改进.

我现在想知道分发Halide代码的最佳策略是什么.要求用户安装Halide在这个时间点似乎是一个很大的障碍(因为没有自动安装选项).

一种选择是使用compile_to_c,在存储库中添加生成的C代码,并为这样的C代码分发编译脚本.scikit-learn为Cython生成的代码使用了类似的策略.对于Halide来说,这似乎是不行的,因为生成的C代码失去了所有的优化,从而破坏了Halide的目的.

我目前的想法是使用 compile_to_bitcode,将生成的bitcode与调用llc的编译脚本一起分发以生成所需的机器代码.用户的唯一要求是安装llc(即llvm).

有没有人有这个问题的经验?
我分发bitcode的想法有什么利弊?
你会推荐什么?

software-distribution image-processing llvm llc halide

5
推荐指数
1
解决办法
833
查看次数

Halide CUDA GPU SGEMM 实现

我正在尝试构建基于 Halide 的图像处理算法,该算法在其中一个阶段需要 SGEMM 函数。

我发现 Halide 有两种矩阵乘法实现:

  1. 线性代数算法(apps/linear_algebra 文件夹
  2. CUDA 矩阵乘法应用程序(apps/cuda_mat_mul 文件夹

对于大小为 1024x1024 的矩阵:

首先,它们在 CPU (Intel i7) 和 Fermi GPU (GF 540M) 上运行得很好,CPU 时间接近 OpenBlas,Fermi GPU 时间接近 cuBlas(约 18ms),但此实现在 Maxwell 上比 cuBlas 慢 10 倍GPU (TitanX) - 5 毫秒与 0.4 毫秒。第二个实现 (cuda_mat_mul) 比 Fermi 上的 cuBlas 慢 3 倍 - 大约 57 毫秒 vs 18 毫秒,在 Maxwell GPU 上比 cuBlas 慢 2 倍 - 1 毫秒 vs 0.4 毫秒

正如我所见 - Halide 可以为 …

halide

5
推荐指数
0
解决办法
991
查看次数

在Android上加载图片并使用卤化物对其进行处理

我将通过提供的file_path加载图像,然后对其进行降采样然后保存。整个事情应该在android设备上完成。

我在将图像加载到设备上并转换为halide :: buffer时遇到麻烦。

如果我像这样使用Halide :: Tools :: load_image不能在android上运行

JNIEXPORT bool JNICALL Java_com_example_boxdownsample_MainActivity_downsample(
        JNIEnv *env, jobject obj, jstring file_path) { ...
    const char *path = env->GetStringUTFChars(file_path, NULL);
    std::string work_path = path;
    LOGD("the path is:%s", path);
    std::string input_file = work_path + "input.png";
    std::string output_file = work_path + "output.png";

    Halide::Buffer<uint16_t> input = Halide::Tools::load_image(input_file);//load_image didn't work ....
    int ret = box_downsample_halide(input, downsample_factor, output_u16); //box_downsample_halide is a static lib generated by halide generator
    ... } }
Run Code Online (Sandbox Code Playgroud)

那么,我使用错了吗?或者我应该使用java(它将是位图格式)加载它,然后将其编码为halide :: buffer,但这似乎有点困难和间接。

有没有更简单的方法可以做到这一点?

谢谢!

更新: 我找到了一种方法,以防万一谁也需要此方法,请转到我的github

android halide

5
推荐指数
0
解决办法
165
查看次数

为什么我的表现不好?(菜鸟调度)

我主要是一名非常高级的程序员,因此思考 CPU 局部性等问题对我来说是非常新鲜的。

我正在研究一个基本的双线性去马赛克(用于 RGGB 传感器数据),并且我的算法是正确的(根据结果判断),但它的性能没有我希望的那么好(~210Mpix/s)。

这是我的代码(输入是具有单通道 RGGB 的 4640x3472 图像):

def get_bilinear_debayer(input_raw, print_nest=False):
    x, y, c = Var(), Var(), Var()

    # Clamp and move to 32 bit for lots of space for averaging.
    input = Func()
    input[x,y] = cast(
        UInt(32),
        input_raw[
            clamp(x,0,input_raw.width()-1),
            clamp(y,0,input_raw.height()-1)]
    )

    # Interpolate vertically
    vertical = Func()
    vertical[x,y] = (input[x,y-1] + input[x,y+1])/2

    # Interpolate horizontally
    horizontal = Func()
    horizontal[x,y] = (input[x-1,y] + input[x+1,y])/2

    # Interpolate on diagonals
    diagonal_average = Func()
    diagonal_average[x, y] = (
        input[x+1,y-1] + …
Run Code Online (Sandbox Code Playgroud)

halide

4
推荐指数
1
解决办法
772
查看次数

使用增强型生成器的双边网格生成器类

我正在尝试使用增强的生成器类(例如使用schedule()and )重新实现双边网格示例generate()。但是在尝试编译代码时出现错误。

g++ -std=c++11 -I ../../include/ -I ../../tools/ -I ../../apps/support/ -g -  fno-rtti bilateral_grid_generator.cpp ../../lib/libHalide.a ../../tools/GenGen.cpp -o bin/bilateral_grid_exec  -ldl -lpthread -lz
bin/bilateral_grid_exec -o ./bin  target=host 
Generator bilateral_grid has base_path ./bin/bilateral_grid
Internal error at /home/xxx/Projects/Halide/src/Generator.cpp:966 triggered by user code at /usr/include/c++/4.8/functional:2057:
Condition failed: generator
make: *** [bin/bilateral_grid.a] Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

看来,我没有把定义RDomGeneratorParam在正确的位置。既然r.xandr.y都用在schedule()and 中generate(),我想我应该把它作为类成员。应该怎么做才能解决这个问题?

这是我写的代码。

class BilateralGrid : public Halide::Generator<BilateralGrid> {
public:
GeneratorParam<int>   s_sigma{"s_sigma", 8};

//ImageParam            input{Float(32), …
Run Code Online (Sandbox Code Playgroud)

halide

2
推荐指数
1
解决办法
333
查看次数

Visual Studio 无法识别已安装 NuGet 包的头文件

我正在尝试通过教程来学习 Halide。我正在 VS 15 中工作,并添加了 Halide 的 NuGet 包,并将其添加为我的项目的引用(如图所示)。我看过的 NuGet 教程似乎表明,一旦我添加引用,VS 应该自动识别项目的头文件,但这并没有发生。我已阅读与此相关的所有 stackoverflow 问题,并尝试卸载并重新安装该包,重新启动 VS,并确保该包位于正确的项目目录中。我陷入困境——如何在 Visual Studio 中引用 Halide?

VS15截图

我是 StackOverflow、Halide 和 Visual Studio 的新手,所以我非常感谢您的帮助。

nuget halide visual-studio-2015

2
推荐指数
1
解决办法
3991
查看次数

用C++初始化Halide Buffer

我正在尝试使用C++ 1D阵列初始化Halide Buffer.鉴于其他一些在线帖子,这是我到目前为止所得到的:

Image<float> in(Buffer(type_of<float>(), size_x, 0, 0, 0, NULL, in_ptr));
Run Code Online (Sandbox Code Playgroud)

其中in_ptr是指向我的C++数组的指针.当我运行这个时,我收到以下错误:

错误:在'('token image in in(Buffer(type_of(),padded_size*(jb + 1),0,0,0,NULL,d_In))之前缺少模板参数;

所以我将我的代码更改为:

Image<float> in(Buffer<float>(type_of<float>(), size_x, 0, 0, 0, NULL, in_ptr));

但这与任何构造函数都不匹配,但我找不到有关如何初始化Buffer的任何好文档.

甚至可以做这样的事情吗?如何使用C++ 1D或2D数组初始化Halide缓冲区?

c++ buffer halide

1
推荐指数
1
解决办法
1498
查看次数

Halide 支持带有 neon 的 ARMv8(aarch64) 吗?

我想将 Halide 用于带有霓虹灯矢量化的 ARM A53(aarch64) 目标。

但我不知道如何创建 Target 对象。另外,我在Target.h中找不到具有 neon 功能的 aarch64 目标。

我测试过的以下代码在 A53 目标上运行,但生成的代码不包含 neon 指令。

Target target("arm-64-linux"); // is it right?
Buffer<uint16_t> input(640,480);

Var x,y;
Func brighter("brighter");
brighter(x,y) = input(x,y) + 100;
brighter.estimate(x, 0, 640).
         estimate(y, 0, 480);

Pipeline p(brighter);
p.auto_schedule(target);
p.compile_to_static_library("./lib_dummy", {input}, "", target);
Run Code Online (Sandbox Code Playgroud)

neon arm64 halide

1
推荐指数
1
解决办法
892
查看次数

Halide :: Expr'不能在上下文中转换为'bool' - 在变量中存储函数的值

我是使用Halide的新手,我正在尝试先实现算法.我正在尝试编写一个函数,根据它周围的8个像素的值,跳过下一个像素或进行一些处理,然后移动到下一个像素.尝试写这个时,我得到以下编译器错误:

84:5:错误:'Halide :: Expr'类型的值不能在上下文中转换为'bool'

    if(input(x,y) > 0)
Run Code Online (Sandbox Code Playgroud)

我已经完成了所有的教程,并且已经看到select函数是一个选项,但有没有办法比较函数的值或将它们存储在某个地方?

我也可能认为这个问题是错误的,或者可能没有用正确的"Halide心态"来实现它,所以任何建议都会很棒.提前谢谢你的一切!

halide

0
推荐指数
1
解决办法
730
查看次数

如何可视化 Halide 相机管道/生成 Halide 编译方式的 HTML 输出?

我尝试将以下行添加到camera_pipe_generator.cpp的底部, 以输出 Halide 如何编译成 .html 文件,但我不确定我做错了什么:

processed.compile_to_lowered_stmt("camera_pipe_debugging_trial.html", {}, HTML);
Run Code Online (Sandbox Code Playgroud)

我认为我的第二个论点是错误的,但是我应该在这里传递什么?

或者有什么不同的方式让我可视化时间表?这篇文章似乎暗示了 Halide 的可视化工具的存在。有没有关于如何使用它的资源?

谢谢你!

编辑:我尝试运行命令

../../tools/gengen.sh -c c++ -lcurses -l ../../lib/libHalide.a -o tmp/ -e html -s camera_pipe_generator.cpp target=host 
Run Code Online (Sandbox Code Playgroud)

但是,这导致了以下错误:

Undefined symbols for architecture x86_64:
  "_del_curterm", referenced from:
      llvm::sys::Process::FileDescriptorHasColors(int) in libHalide.a(llvm_460_Process.cpp.o)
  "_set_curterm", referenced from:
      llvm::sys::Process::FileDescriptorHasColors(int) in libHalide.a(llvm_460_Process.cpp.o)
  "_setupterm", referenced from:
      llvm::sys::Process::FileDescriptorHasColors(int) in libHalide.a(llvm_460_Process.cpp.o)
  "_tigetnum", referenced from:
      llvm::sys::Process::FileDescriptorHasColors(int) in libHalide.a(llvm_460_Process.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to …
Run Code Online (Sandbox Code Playgroud)

halide

0
推荐指数
1
解决办法
680
查看次数