【问题标题】:Access vector type OpenCL访问向量类型 OpenCL
【发布时间】:2012-04-05 00:55:18
【问题描述】:

我在内核中有一个变量,例如:

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]);

我知道这很糟糕,但它确实有效,;-)

【问题讨论】:

  • 您可以像在 C 中一样使用结构和数组:int16 element[3]; 或者我不明白这个问题...
  • 他不是在问向量数组。他问的是如何使用数组表示法访问向量的组件。

标签: vector opencl


【解决方案1】:

还有更脏的方法:),我希望 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 内核中不可用,你是如何使它工作的??

【讨论】:

  • 大声笑...很好!好多了,我忘了工会!关于 rand,这只是一个例子,我的向量是在设备外部填充的。谢谢
【解决方案2】:

使用指针是一个非常简单的解决方案

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】:

    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);
    }
    

    【讨论】:

    • 常量缓冲区是否从与全局缓冲区不同的内存库中加载?还是它们都共享相同的内存线?
    • 这只是 GCN 之前的版本吗?您知道它是否符合标准,或者至少在较新的 AMD 中是否仍被推荐和支持?
    【解决方案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;
    }
    

    当然,如果您需要以这种方式进行组件式访问,那么您最好不要使用向量。

    【讨论】:

      【解决方案5】:

      我使用这种解决方法,希望编译器足够聪明,能够理解我的意思(我认为元素访问是标准中的一个严重遗漏):

      int16 vec;
      // access i-th element:
      ((int*)vec)[i]=...;
      

      【讨论】:

        【解决方案6】:

        不,那是不可能的。至少在运行时不是动态的。但是您可以使用“编译时”索引来访问组件:

        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 节

        【讨论】:

          猜你喜欢
          • 2011-11-06
          • 2022-11-03
          • 2013-12-15
          • 1970-01-01
          • 2020-02-19
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多