在OpenCL 1.0中重新解释参数时出现问题



是否可以重新解释已传递到OpenCL内核中的参数。例如,如果我传入了一个整数数组,但我想将索引16处的整数解释为浮点(不要问为什么!),那么我会认为这会起作用。

__kernel void Test(__global float* im, __constant int* constArray)
{
  float x = *( (__constant float*) &constArray[16] );
  im[0] = x;
}

然而,当我下一次尝试使用命令队列时,我会得到一个CL_INVALID_COMMAND_QUEUE错误,这意味着上面的代码执行了非法操作。

有人建议以上内容有什么问题,和/或如何实现重新解释?

我现在已经尝试过:

__kernel void Test(__global float* im, __constant int* constArray)
{
  float x = as_float(0x3f800000);
  im[0] = x;
}

这确实在im[0]中给出了1.0f。然而,

__kernel void Test(__global float* im, __constant int* constArray)
{
  float x = as_float(constArray[16]);
  im[0] = x;
}

无论constArray[16]中有什么,总是在im[0]中导致零。

问候,

马克。

OpenCL包含as_typen运算符家族,用于重新解释从一种类型到另一种类型的值强制转换。如果我理解这个问题,你应该能够做一些类似的事情

__kernel void Test(__global float* im, __constant int* constArray)
{
  float x = as_float(constArray[16]);
  im[0] = x;
}