2015-10-07 4 views
0

Я не могу сгенерировать реализацию OpenCL с Halide, когда выбираю тип граничного условия constant_exterior() с векторизованным планированием.Halide: Использование constant_exterior() + vectorize() в OpenCL

При компиляции, я получаю следующее сообщение об ошибке:

Error: 
Vector of bool not valid in OpenCL C (yet) 

Я не понимаю, почему это нужно будет использовать булеву вектор ..

Моя функция выглядит примерно так:

void dummy_step() 
{ 
    Var x("x"), y("y"), c("c"); 
    Func src("src"); 
    Func dst("dst"); 

    // input parameters 
    ImageParam image(UInt(8), 3, "inputImage"); 
    Param<int> W; 
    Param<int> H; 

    // boundary condition 
    src = constant_exterior(image, 0, 0, W, 0, H); 

    Expr x0 = cast<int>(x + y); 
    Expr y0 = cast<int>(x - y); 

    dst(x, y, c) = cast<uint8_t>(clamp(src(x0, y0, c), 0.0f, 255.0f)); 

    // scheduling 
    dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root(); 

    dst.compile_to_file("test", {image, W, H}); 
} 

Если я удалю .vectorize(x, 4), код компилируется. Если я использую другое граничное условие, скажем, src = repeat_edge(image, 0, W, 0, H);, он также работает.

ответ

0

constant_exterior проверяет, находится ли каждая координата x в векторе в пределах границ для мультиплексирования между постоянным внешним значением и внутренними значениями. Результатом этой проверки является вектор булевых. repeat_edge не нужно делать эту проверку - он может просто зажимать координаты напрямую, используя операции min и max.

Я предлагаю не векторизации этой части кода, используя график, как так:

src.compute_at(dst, x); 
    dst.vectorize(x, 4).gpu_tile(x, y, 16, 8).compute_root(); 
+0

меня поражает как ошибка в галоиде, хотя. Должно быть возможно исправить codegen для этого, но по крайней мере должно быть лучшее сообщение об ошибке. –

+0

Ошибка здесь: https://github.com/halide/Halide/issues/939 –

+0

Я попытался использовать планируемое предложение, но он говорит мне, что «constant_exterior» вычисляется в недопустимом месте. – thalie