小编jpr*_*ice的帖子

推荐的方式来分发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
查看次数

LD_PRELOAD在动态库加载器中导致分段错误

我写了一个库,打算通过它加载LD_PRELOAD.在某些Linux系统上,这会导致动态库加载器在初始化期间出现段错误.

我有一个简单的测试用例,表现出这种行为,但只有我链接-lm.例如:

# Works fine
gcc -o vecadd.normal -std=c99 vecadd.c -lOpenCL
LD_PRELOAD=/path/to/my/library.so ./vecadd.normal

# Causes segmentation fault
gcc -o vecadd.broken -std=c99 vecadd.c -lOpenCL -lm
LD_PRELOAD=/path/to/my/library.so ./vecadd.broken
Run Code Online (Sandbox Code Playgroud)

关于这一点的奇怪之处在于它libm.so似乎包含在两个版本中:ldd显示完全相同的库集,只是以不同的顺序:

vecadd.normal:
  linux-vdso.so.1 =>  (0x00007fffed9ff000)
  libOpenCL.so => /usr/lib64/libOpenCL.so (0x00007f135c9b1000)
  libc.so.6 => /lib64/libc.so.6 (0x00007f135c61c000)
  libdl.so.2 => /lib64/libdl.so.2 (0x00007f135c418000)
  libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007f135c20f000)
  libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f135bf08000)
  libm.so.6 => /lib64/libm.so.6 (0x00007f135bc84000)
  libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f135ba6e000)
  /lib64/ld-linux-x86-64.so.2 (0x00007f135cbd4000)
vecadd.broken:
  linux-vdso.so.1 =>  (0x00007fff25c74000)
  libOpenCL.so => /usr/lib64/libOpenCL.so (0x00007fb8c071e000)
  libm.so.6 => /lib64/libm.so.6 …
Run Code Online (Sandbox Code Playgroud)

linux ld segmentation-fault ld-preload

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

OpenCL 将 float3 主机发送到设备

我无法将一些数据发送到我的设备。

我想在内核中接收的数据类型是:

typedef struct{uint3 nbCells;
    float3 worldOrigin;
    float3 cellSize;
    float3 gridSize;
    float  radius;
} grid_t;
Run Code Online (Sandbox Code Playgroud)

我从主机发送的数据类型是:

typedef struct{
    uint nbCells[3];
    float worldOrigin[3];
    float cellSize[3];
    float gridSize[3];
    float radius; 
} grid_t;
Run Code Online (Sandbox Code Playgroud)

但效果不佳。

我发送:

8, 8, 8; 0, 0, 0; 1.03368e-06, 1.03368e-06, 1.03368e-06; 8.2694e-06, 8.2694e-06, 8.2694e-06; 3e-07
Run Code Online (Sandbox Code Playgroud)

但在我的内核中,我收到了:

8, 8, 8; 0, 0 1.03368e-06; 1.03368e-06, 8.2694e-06, 8.2694e-06; 3e-07, 8.2694e-06, 0; 1.16428e-05
Run Code Online (Sandbox Code Playgroud)

我知道 float3 实际上在 Opencl 中被认为类似于 float4,所以我尝试使用 float4 和 4 个浮点数组,但它也不起作用。我尝试使用 3 个浮点数组而不是 float3 来接收数据,并且它工作得很好。它似乎在 opencl 中,由 3 个浮点数组成的结构没有与 3 个浮点数数组相同的内存大小。并且具有相同的结构,但使用 double …

opencl

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