_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)的索引和所有变量的大小。
但是,没有错。
任何有任何建议的人,请帮忙!
答案 0 :(得分:0)
你说它运作不好会出现什么问题?另外你为什么不在异步拷贝中做任何事情?也许一个简单的全局到本地任务可以工作。为什么内核末端有一个局部障碍?
无论如何,错误似乎是异步副本。它对于组中的每个线程具有不同的值。为了使其正常工作,必须在组的所有线程中给出完全相同的数字。这就是为什么它适用于本地大小= 1而不适用于更大的本地群体。
例如,glid
对于组中的所有64个线程都不同,因此它不起作用。异步工作组复制命令使组的所有线程在同一副本上工作。没有不同的副本。如果您需要不同的副本,则需要串行多个异步命令,但如果您同时使用所有这些命令,则它们将同步。