将 float4 分配给 float 数组 opencl
Assigning float4 to float array opencl
我正在尝试使用 float4 而不是 float 来优化一个简单的 opencl 内核。
这是没有 float4 的示例代码。
示例代码:
__kernel void Substract (
__global const float* data,
const float val,
__global float* result
){
size_t gi = get_global_id(0);
float input_val = data[gi];
result[gi] = val - input_val;
}
我对 float4 的想法:
__kernel void substract (
__global const float* data,
const float val,
__global float* result
){
size_t gi = get_global_id(0);
float4 val2 = float4 (val,val,val,val);
float4 input_val = data[gi*4];
result[gi] = val2 - input_val;
}
但是这不起作用,因为我们不能将 float4 结果写回 float 数组。是否有可能将 float4 写回 opencl 中的普通 float 数组?简单的想法是使用 4 运行s.
的 for 循环
我想为 gpu 和 cpu 优化内核。
因此,如果我有一个带 float4 的变体和一个不带 float4 的变体,两者都应该 运行 在完全相同的内核参数下。这可能吗?
您可以只将参数声明为 float4
指针,而无需更改主机上的任何内容。此外,如果在包含向量的表达式中使用标量值,编译器应自动加宽标量值,因此您无需手动创建 val
:
的 float4
版本
__kernel void Substract (
__global const float4* data,
const float val,
__global float4* result
){
size_t gi = get_global_id(0);
float4 input_val = data[gi];
result[gi] = val - input_val;
}
我正在尝试使用 float4 而不是 float 来优化一个简单的 opencl 内核。
这是没有 float4 的示例代码。
示例代码:
__kernel void Substract (
__global const float* data,
const float val,
__global float* result
){
size_t gi = get_global_id(0);
float input_val = data[gi];
result[gi] = val - input_val;
}
我对 float4 的想法:
__kernel void substract (
__global const float* data,
const float val,
__global float* result
){
size_t gi = get_global_id(0);
float4 val2 = float4 (val,val,val,val);
float4 input_val = data[gi*4];
result[gi] = val2 - input_val;
}
但是这不起作用,因为我们不能将 float4 结果写回 float 数组。是否有可能将 float4 写回 opencl 中的普通 float 数组?简单的想法是使用 4 运行s.
的 for 循环我想为 gpu 和 cpu 优化内核。 因此,如果我有一个带 float4 的变体和一个不带 float4 的变体,两者都应该 运行 在完全相同的内核参数下。这可能吗?
您可以只将参数声明为 float4
指针,而无需更改主机上的任何内容。此外,如果在包含向量的表达式中使用标量值,编译器应自动加宽标量值,因此您无需手动创建 val
:
float4
版本
__kernel void Substract (
__global const float4* data,
const float val,
__global float4* result
){
size_t gi = get_global_id(0);
float4 input_val = data[gi];
result[gi] = val - input_val;
}