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

VexCL: set values common to all vector elements

本文关键字:元素 向量 设置 VexCL      更新时间:2023-10-16

我使用光线追踪和使用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_CONSTANT, vex::raw_pointer,但这不是我需要的。

如果将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更改为浮点向量,请参阅如何在VexCL中使用结构体的链接问题。)camera_dircamera_upcamera_fov是在主机端定义的,它们作为参数传递给内核。所以没有不必要的复制。下面是生成的OpenCL内核:

float dummy(ulong idx, float4 dir, float4 up, float fov) {
  return idx + length(dir - up) + fov;
}
kernel void vexcl_vector_kernel(
  ulong n,
  global float * prm_1,
  ulong prm_2,
  float4 prm_3,
  float4 prm_4,
  float prm_5
)
{
  for(ulong idx = get_global_id(0); idx < n; idx += get_global_size(0))
  {
    prm_1[idx] = dummy( (prm_2 + idx), prm_3, prm_4, prm_5 );
  }
}