VexCL:设置所有向量元素共有的值

时间:2015-08-20 11:08:05

标签: c++ opencl

我使用光线跟踪并使用GPU计算像素颜色。我正在使用NVIDIA CUDA,现在想去VexCL。我正在尝试使用这样的代码:

struct Ray;
vex::Context ctx(...);

...

unsigned int frame_width, frame_height;
std::array<float, 4> camera_direction, camera_up;
float camera_fov;

...

// initialize values and store them in GPU memory too

...

vex::vector<Ray> rays(ctx, frame_width * frame_height);

等等

rays = some_expression_to_calculate_ray(vex::element_index(), frame_width,
                                        camera_direction, camera_up, camera_fov);

所以我的问题是:如何向VexCL解释所有向量元素的某些值必须是通用的?

我正在尝试VEX_CONSTANTvex::raw_pointer,但这不是我需要的。

1 个答案:

答案 0 :(得分:0)

如果您将camera_directioncamera_up的类型从std::array<float,4>更改为cl_float4,那么您就可以直接在表达式中使用这些:

#include <vexcl/vexcl.hpp>

int main() {
    vex::Context ctx(vex::Filter::Env);

    VEX_FUNCTION(float, dummy, (size_t, idx)(cl_float4, dir)(cl_float4, up)(float, fov),
            // whatever
            return idx + length(dir - up) + fov;
            );

    cl_float4 camera_dir = {1, 2, 3, 4}, camera_up = {1, 0, 0, 0};
    float camera_fov = 42;

    vex::vector<float> rays(ctx, 1024);

    rays = dummy(vex::element_index(), camera_dir, camera_up, camera_fov);
}

(为了简单起见,我已将rays更改为浮点数向量,请参阅linked question了解如何使用VexCL中的结构。)camera_dir,{{1并且camera_up被定义为主机端,并且它们作为参数传递给内核。所以没有不必要的副本。这是生成的OpenCL内核:

camera_fov