OpenCL中的计算单元数

时间:2017-03-26 13:19:53

标签: parallel-processing opencl gpgpu

_kernel void kmp(__global char pattern[2*4], __global char* string, __global int failure[2*4], __global int ret[2], int g_length, int l_length, int thread_num){
    int pattern_num = 2;
    int pattern_size = 4;
    int gid = get_group_id(0);
    int glid = get_global_id(0);
    int lid = get_local_id(0);
    int i, j, x = 0;
    int old = 0;

    __local char tmp_string[32768];
    event_t event;

    event  = async_work_group_copy(tmp_string+lid*l_length, string+glid*l_length, l_length, 0);
    wait_group_events(1, &event);

    for(i = 0; i < pattern_num; i++){
            x = i*pattern_size;
            for(j = lid*l_length; j < (lid+1)*l_length; j++){
                    while(tmp_string[j] != pattern[x] && x > 0 && x != i*pattern_size){
                            x = failure[x-1]+i*pattern_size;
                    }

                    if(tmp_string[j] == pattern[x]){
                            if(x == (i+1)*pattern_size-1){
                                    //ret[i]++;
                                    old = atomic_add(&ret[i], 1);
                                    x = failure[x]+i*pattern_size;
                            }

                            else{
                                    x++;
                            }
                    }
            }
    }

    barrier(CLK_LOCAL_MEM_FENCE);
}

我需要有关此代码的帮助。

为了在字符串中找到匹配的模式,我编写了这样的代码。

我正在使用AMD夏威夷,它有44个组,每组有64个核心(我的意思是总计2816个计算单位)。

问题是当我尝试使用超过44个计算单元时(在一个组中使用多于1个核心;像88个单元一样 - 每组使用2个核心 - 或2816个单元 - 每组使用64个核心 - )效果不好。

无法正确找到匹配的号码。

我检查了字符串,ids(glid,gid,lid)的索引和所有变量的大小。

但是,没有错。

任何有任何建议的人,请帮忙!

1 个答案:

答案 0 :(得分:0)

你说它运作不好会出现什么问题?另外你为什么不在异步拷贝中做任何事情?也许一个简单的全局到本地任务可以工作。为什么内核末端有一个局部障碍?

无论如何,错误似乎是异步副本。它对于组中的每个线程具有不同的值。为了使其正常工作,必须在组的所有线程中给出完全相同的数字。这就是为什么它适用于本地大小= 1而不适用于更大的本地群体。

例如,glid对于组中的所有64个线程都不同,因此它不起作用。异步工作组复制命令使组的所有线程在同一副本上工作。没有不同的副本。如果您需要不同的副本,则需要串行多个异步命令,但如果您同时使用所有这些命令,则它们将同步。