OpenCL通道动态索引

OpenCL通道动态索引,opencl,matrix-multiplication,channel,Opencl,Matrix Multiplication,Channel,我想为矩阵乘法实现一个脉动结构。我的目标是为每个处理元素使用一个内核,因此我将从主机部分多次执行同一个内核 为了在内核之间进行通信,我希望使用通道或管道。问题在于“通道扩展不支持对通道ID数组进行动态索引”。内核的数量将取决于矩阵的大小,因此我需要一些方法将通道自动连接到相应的内核 总之,我正在寻找创建此功能的方法: channel float c0[32]; __kernel void producer (__global float * data_in){ for(int i=0;

我想为矩阵乘法实现一个脉动结构。我的目标是为每个处理元素使用一个内核,因此我将从主机部分多次执行同一个内核

为了在内核之间进行通信,我希望使用通道或管道。问题在于“通道扩展不支持对通道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]);
    }
}
信道浮点c0[32];
__内核无效生成器(uu全局浮点*数据_uin){
for(int i=0;iOpenCL通道(英特尔FPGA扩展)不支持“真”动态
索引,但在大多数情况下,您可以通过
使用
开关
#pragma展开
方法:

开关
方法如所述:

如果在通道上有循环,也可以使用
#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]);
    }
}
\uuuu内核无效使用者(){
int值[工作组大小]
#布拉格展开
对于(int i=0;i
谢谢。如果我在编译内核之前知道通道的确切数量以及通道的连接方式,我认为这些解决方案会起作用。在我的情况下,我希望一个带有通道的内核可以连接到其他内核。我的想法是,此内核的并发执行次数不确定,并配置通道的连接我认为您可以按照
开关
的方法修改它以适合您的用例,尽管它可能不是非常方便。
__kernel void consumer() {
    int values[WORKGROUP_SIZE]
    #pragma unroll
    for (int i = 0; i < WORKGROUP_SIZE; ++i) {
        values[i] = read_channel_intel(ch[i]);
    }
}