我正在将结构指针传递给我的内核 - 如何让辅助函数可以访问这些数据?

时间:2011-06-27 20:43:28

标签: macos opencl

美好的一天,伙计们!

我的内核需要100多个参数。我为数据创建一个缓冲区对象,执行写操作,并将指向该数据的指针设置为内核参数。 (内核arg是__global,但我已尝试过其他类型。)

到目前为止一切顺利!我可以从我的内核函数中看到结构的元素就好了!

但是,我想要十几个辅助函数来访问这些参数。我试过了,但我还没有办法做到这一点。如果我尝试将(__global)vh复制到另一个全局指针,__local指针或__private指针,它将失败。如果我尝试将结构数据本身复制到结构的__global,__local或__private副本中,则会失败。我已经尝试了逐字节副本,我尝试过async_work_group_copy,我尝试过强制转换,我尝试将整个__global指针传递给辅助函数,我尝试过其他类型的内核arg本身,我试过了我能想到的一切。似乎可能无法将这些数据传递给这些辅助函数,但它必须可能,对吗?

任何答案都会受到欢迎,即使它是“无法做到的”,或“你是个白痴”。我在另一个论坛上问了这个问题,并且没有人说过这么多,尽管也许我没有正确地说出我的问题。但是......我不能成为世界上唯一一个在内核代码中使用辅助函数的人,对吗?你如何获得传递给内核函数的数据?

谢谢大家...... 大卫 感谢....

1 个答案:

答案 0 :(得分:2)

这是一个演示您想要的功能的示例,希望它有所帮助!

结构定义:

typedef struct agent {
    uint energy;
    uint action;
    uint type;
    uint next;
} AGENT __attribute__ ((aligned (16)));

typedef struct sim_params {
    uint size_x;
    uint size_y;
    uint size_xy;
    uint max_agents;
    uint null_agent_pointer;
    uint grass_restart;
    uint lines_per_thread;
} SIM_PARAMS;

typedef struct cell {
    uint grass;
    uint agent_pointer;
} CELL;

辅助功能:

/*
 * Helper function
 */
void removeAgentFromCell(__global AGENT * agents, 
    __global CELL * matrix,
    uint cellIndex,
    uint agentIndex,
    uint previousAgentIndex,
    SIM_PARAMS sim_params) 
{

    ...
}

主要内核:

/*
 * The kernel
 */
__kernel void step1(__global AGENT * agents, 
        __global CELL * matrix,
        __global ulong * seeds,
        const uint turn,
        const SIM_PARAMS sim_params)
{
    uint index;
    uint agentIndex;
    uint previousAgentIndex;
    ...
    // Call helper function
    removeAgentFromCell(agents, matrix, index, agentIndex, previousAgentIndex, sim_params);
    ...
}

尝试并测试并使用AMD APP SDK(在CPU和GPU上)和Nvidia CUDA Toolkit。所以我猜它会在OSX中运行。