我正在尝试在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) 我目前正在尝试使用Halide,初步测试显示出非常有前景的性能改进.
我现在想知道分发Halide代码的最佳策略是什么.要求用户安装Halide在这个时间点似乎是一个很大的障碍(因为没有自动安装选项).
一种选择是使用compile_to_c,在存储库中添加生成的C代码,并为这样的C代码分发编译脚本.scikit-learn为Cython生成的代码使用了类似的策略.对于Halide来说,这似乎是不行的,因为生成的C代码失去了所有的优化,从而破坏了Halide的目的.
我目前的想法是使用
compile_to_bitcode,将生成的bitcode与调用llc的编译脚本一起分发以生成所需的机器代码.用户的唯一要求是安装llc(即llvm).
有没有人有这个问题的经验?
我分发bitcode的想法有什么利弊?
你会推荐什么?
我正在尝试构建基于 Halide 的图像处理算法,该算法在其中一个阶段需要 SGEMM 函数。
我发现 Halide 有两种矩阵乘法实现:
对于大小为 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 可以为 …
我将通过提供的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
我主要是一名非常高级的程序员,因此思考 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) 我正在尝试使用增强的生成器类(例如使用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)
看来,我没有把定义RDom和GeneratorParam在正确的位置。既然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。我正在 VS 15 中工作,并添加了 Halide 的 NuGet 包,并将其添加为我的项目的引用(如图所示)。我看过的 NuGet 教程似乎表明,一旦我添加引用,VS 应该自动识别项目的头文件,但这并没有发生。我已阅读与此相关的所有 stackoverflow 问题,并尝试卸载并重新安装该包,重新启动 VS,并确保该包位于正确的项目目录中。我陷入困境——如何在 Visual Studio 中引用 Halide?
我是 StackOverflow、Halide 和 Visual Studio 的新手,所以我非常感谢您的帮助。
我正在尝试使用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缓冲区?
我想将 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) 我是使用Halide的新手,我正在尝试先实现算法.我正在尝试编写一个函数,根据它周围的8个像素的值,跳过下一个像素或进行一些处理,然后移动到下一个像素.尝试写这个时,我得到以下编译器错误:
84:5:错误:'Halide :: Expr'类型的值不能在上下文中转换为'bool'
if(input(x,y) > 0)
Run Code Online (Sandbox Code Playgroud)
我已经完成了所有的教程,并且已经看到select函数是一个选项,但有没有办法比较函数的值或将它们存储在某个地方?
我也可能认为这个问题是错误的,或者可能没有用正确的"Halide心态"来实现它,所以任何建议都会很棒.提前谢谢你的一切!
我尝试将以下行添加到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)