0
我得到了一個函數f(x,y,z),其值爲1和0,並且我需要獲得等於值的前100個座標到1,減少/更新到0.Halide:通過特定值的域減少
這是非常簡單的實現在C和其他語言,但是,我一直在試圖解決它與鹵化物幾天。是否有任何函數或算法可用於在Halide Generator中解決它?
我得到了一個函數f(x,y,z),其值爲1和0,並且我需要獲得等於值的前100個座標到1,減少/更新到0.Halide:通過特定值的域減少
這是非常簡單的實現在C和其他語言,但是,我一直在試圖解決它與鹵化物幾天。是否有任何函數或算法可用於在Halide Generator中解決它?
這個問題相當於「我如何在鹵化物中實施物流壓實?」有很多關於平行流壓縮的文章,做得很好也是有點不重要的。看到這個堆棧溢出答案在CUDA做了一些討論和參考:CUDA stream compaction algorithm
使用前綴總和滷的快速實現簡單的流壓實看起來像這樣:
#include "Halide.h"
#include <iostream>
using namespace Halide;
static void print_1d(const Buffer<int32_t> &result) {
std::cout << "{ ";
const char *prefix = "";
for (int i = 0; i < result.dim(0).extent(); i++) {
std::cout << prefix << result(i);
prefix = ", ";
}
std::cout << "}\n";
}
int main(int argc, char **argv) {
uint8_t vals[] = {0, 10, 99, 76, 5, 200, 88, 15};
Buffer<uint8_t> in(vals);
Var x;
Func prefix_sum;
RDom range(1, in.dim(0).extent() - 1);
prefix_sum(x) = (int32_t)0;
prefix_sum(range) = select(in(range - 1) > 42, prefix_sum(range - 1) + 1, prefix_sum(range - 1));
RDom in_range(0, in.dim(0).extent());
Func compacted_indices;
compacted_indices(x) = -1;
compacted_indices(clamp(prefix_sum(in_range), 0, in.dim(0).extent() - 1)) = select(in(in_range) > 42, in_range, - 1);
Buffer<int32_t> sum = prefix_sum.realize(8);
Buffer<int32_t> indices = compacted_indices.realize(8);
print_1d(sum);
print_1d(indices);
return 0;
}
謝謝你,Zalman的。獲得座標的方式令人印象深刻。但是,對於多維度,如果我想要使用這種方法,輸入必須是緩衝區,是否有可能在發生器中實現緩衝區? – user8769167
例如,我得到發電機中的af(x,y,z),我認爲有必要將它減少到1維以prefix_sum它,這需要實現f(x,y,z)到緩衝區,是否有可能實現它並獲得發電機中的緩衝區? – user8769167
您應該可以使用多維'RDom'來做2D前綴求和。可能有一些事情出錯了。如果減少'Func'是輸出,那麼邊界不能超過數據的邊界。 (例如,當第一個有效結果爲0時,寫入初始值爲-1的簡化很容易)。您看到了什麼錯誤? –