OpenCL通道动态索引

时间:2018-04-22 22:09:13

标签: opencl matrix-multiplication channel

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

要在内核之间进行通信,我想使用通道或管道。问题是“频道扩展不支持动态索引到频道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]);
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:0)

OpenCL频道(英特尔FPGA扩展)不支持&#34; true&#34;动态 索引,但你可以在大多数情况下解决这个限制 使用switch#pragma unroll方法:

Intel FPGA SDK for OpenCL Programming Guide中描述了

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]);
    }
}