我在内核中有一个变量,如:
int16 element;
我想知道是否有办法在
元素中添加第三个int element[2]
这样我就像写element.s2一样
那我该怎么办呢:
int16 element;
int vector[100] = rand() % 16;
for ( int i=0; i<100; i++ )
element[ vector[i] ]++;
我的方式是:
int temp[16] = {0};
int16 element;
int vector[100] = rand() % 16;
for ( int i=0; i<100; i++ )
temp[ vector[i] ]++;
element = (int16)(temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],temp[10],temp[11],temp[12],temp[13],temp[14],temp[15]);
我知道这很糟糕,但它确实有效;; - )
答案 0 :(得分:13)
那么还有更脏的方法:),我希望OpenCL提供更好的遍历矢量元素的方法。
这是我的方式。
union
{
int elarray[16];
int16 elvector;
} element;
//traverse the elements
for ( i = 0; i < 16; i++)
element.elarray[i] = temp[vector[i]]++;
Btw rand()函数在OpenCL内核中不可用,你是如何使它工作的?
答案 1 :(得分:9)
AMD recommends以这种方式获取矢量组件:
将掩码数组放入OpenCl常量缓冲区:
cl_uint const_masks[4][4] =
{
{0xffffffff, 0, 0, 0},
{0, 0xffffffff, 0, 0},
{0, 0, 0xffffffff, 0},
{0, 0, 0, 0xffffffff},
}
在内核中写下这样的东西:
uint getComponent(uint4 a, int index, __constant uint4 * const_masks)
{
uint b;
uint4 masked_a = a & const_masks[index];
b = masked_a.s0 + masked_a.s1 + masked_a.s2 + masked_a.s3;
return (b);
}
__kernel void foo(…, __constant uint4 * const_masks, …)
{
uint4 a = ….;
int index = …;
uint b = getComponent(a, index, const_masks);
}
答案 2 :(得分:8)
使用指针是一个非常简单的解决方案
float4 f4 = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
int gid = get_global_id(0);
float *p = &f4;
result[gid]=p[3];
答案 3 :(得分:4)
是可能的,但它不如直接数组访问那么有效。
float index(float4 v, int i) {
if (i==0) return v.x;
if (i==1) return v.y;
if (i==2) return v.z;
if (i==3) return v.w;
}
但是,当然,如果您需要以这种方式进行分量访问,那么您最好不要使用向量。
答案 4 :(得分:4)
我使用这种解决方法,希望编译器足够智能,看看我的意思(我认为元素访问是标准的一个严重遗漏):
int16 vec;
// access i-th element:
((int*)vec)[i]=...;
答案 5 :(得分:2)
不,这是不可能的。至少在运行时不动态。但您可以使用“编译时”-index来访问组件:
float4 v;
v.s0 == v.x; // is true
v.s01 == v.xy // also true
参见http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf第6.1.7节