我想实现矩阵乘法的收缩结构。我的目标是为每个处理元素使用单个内核,因此我将多次从主机部分执行相同的内核。
要在内核之间进行通信,我想使用通道或管道。问题是“频道扩展不支持动态索引到频道ID数组”。内核的数量取决于矩阵的大小,所以我需要一些方法将通道自动连接到相应的内核。
总结一下,我正在寻找一种创建此功能的方法:
channel float c0[32];
__kernel void producer (__global float * data_in){
for(int i=0; i<32; i++){
write_channel_altera(c0[i],data_in[i]);
}
}
__kernel void consumer (__global float * ret_buf){
for(int i=0; i<32; i++){
ret_buf[i]=read_channel_altera(c0[i]);
}
}
提前致谢!
答案 0 :(得分:0)
OpenCL频道(英特尔FPGA扩展)不支持&#34; true&#34;动态
索引,但你可以在大多数情况下解决这个限制
使用switch
或#pragma unroll
方法:
switch
方法:
channel int ch[WORKGROUP_SIZE];
__kernel void consumer() {
int gid = get_global_id(0);
int value;
switch(gid)
{
case 0: value = read_channel_intel(ch[0]); break;
case 1: value = read_channel_intel(ch[1]); break;
case 2: value = read_channel_intel(ch[2]); break;
case 3: value = read_channel_intel(ch[3]); break;
//statements
case WORKGROUP_SIZE-1:read_channel_intel(ch[WORKGROUP_SIZE-1]); break;
}
}
如果你有一个循环通道,你也可以使用#pragma unroll
:
__kernel void consumer() {
int values[WORKGROUP_SIZE]
#pragma unroll
for (int i = 0; i < WORKGROUP_SIZE; ++i) {
values[i] = read_channel_intel(ch[i]);
}
}