美好的一天,伙计们!
我的内核需要100多个参数。我为数据创建一个缓冲区对象,执行写操作,并将指向该数据的指针设置为内核参数。 (内核arg是__global,但我已尝试过其他类型。)
到目前为止一切顺利!我可以从我的内核函数中看到结构的元素就好了!
但是,我想要十几个辅助函数来访问这些参数。我试过了,但我还没有办法做到这一点。如果我尝试将(__global)vh复制到另一个全局指针,__local指针或__private指针,它将失败。如果我尝试将结构数据本身复制到结构的__global,__local或__private副本中,则会失败。我已经尝试了逐字节副本,我尝试过async_work_group_copy,我尝试过强制转换,我尝试将整个__global指针传递给辅助函数,我尝试过其他类型的内核arg本身,我试过了我能想到的一切。似乎可能无法将这些数据传递给这些辅助函数,但它必须可能,对吗?
任何答案都会受到欢迎,即使它是“无法做到的”,或“你是个白痴”。我在另一个论坛上问了这个问题,并且没有人说过这么多,尽管也许我没有正确地说出我的问题。但是......我不能成为世界上唯一一个在内核代码中使用辅助函数的人,对吗?你如何获得传递给内核函数的数据?
谢谢大家...... 大卫 感谢....
答案 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中运行。