我想实现矩阵乘法的收缩结构。我的目标是为每个处理元素使用一个内核,因此我将从主机部分多次执行相同的内核。
为了在内核之间进行通信,我想使用通道或管道。问题是"通道扩展不支持动态索引到通道 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]);
}
}
提前感谢!
OpenCL 通道(英特尔 FPGA 扩展(不支持"真正的"动态索引,但在大多数情况下,您可以通过以下方式解决此限制使用switch
或#pragma unroll
方法:
面向 OpenCL 的英特尔 FPGA SDK 编程指南中介绍了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]);
}
}
据我所知,在为电路板编译程序之前,我们需要知道我们最多需要多少个通道,因为我们不能像对其他计算系统那样对FPGA进行编程,并在旅途中分配资源。一旦我们知道最大数量(至少(我们可以使用
#pragma 展开
在我们开始读取/写入通道的循环之前