OpenCL 通道动态索引



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

为了在内核之间进行通信,我想使用通道或管道。问题是"通道扩展不支持动态索引到通道 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 展开

在我们开始读取/写入通道的循环之前

最新更新