【发布时间】:2015-04-25 12:39:48
【问题描述】:
我有一个 opencl 内核,可以在字符串中找到最大的 ASCII 字符。 问题是我无法将多个读写同步到全局和本地内存。 我正在尝试通过将其与 local_maximum 进行比较来更新共享内存中的 local_maximum 字符,并在工作组(最后一个线程)的末尾更新 global_maximum 字符。我猜,线程是一个接一个地写。
例如:输入字符串:“加勒比海盗”。
输出字符串:'r'(但应该是's')。
请查看代码并给出一个解决方案,说明我可以做些什么来同步所有内容。我相信有扎实知识的人可以理解代码。欢迎提供优化提示。
代码如下:
__kernel void find_highest_ascii( __global const char* data, __global char* result, unsigned int size, __local char* localMaxC )
{
//creating variables and initialising..
unsigned int i, localSize, globalSize, j;
char privateMaxC,temp,temp1;
i = get_global_id(0);
localSize = get_local_size(0);
globalSize = get_global_size(0);
privateMaxC = '\0';
if(i<size){
if(i == 0)
read_mem_fence( CLK_LOCAL_MEM_FENCE );
*localMaxC = '\0';
mem_fence( CLK_LOCAL_MEM_FENCE);
////////////////////////////////////////////////////
/////UPDATING PRIVATE MAX CHARACTER/////////////////
////////////////////////////////////////////////////
for( j = i; j<size; j+=globalSize )
{
if( data[j] > privateMaxC )
{
privateMaxC = data[j];
}
}
///////////////////////////////////////////////////
///////////////////////////////////////////////////
////UPDATING SHARED MAX CHARACTER//////////////////
///////////////////////////////////////////////////
temp = *localMaxC;
read_mem_fence( CLK_LOCAL_MEM_FENCE );
if(privateMaxC>temp)
{
*localMaxC = privateMaxC;
write_mem_fence( CLK_LOCAL_MEM_FENCE );
temp = privateMaxC;
}
//////////////////////////////////////////////////
//UPDATING GLOBAL MAX CHARACTER.
temp1 = *result;
if(( (i+1)%localSize == 0 || i==size-1) && (temp > temp1 ))
{
read_mem_fence( CLK_GLOBAL_MEM_FENCE );
*result = temp;
write_mem_fence( CLK_GLOBAL_MEM_FENCE );
}
}
}
【问题讨论】:
标签: opencl thread-synchronization memory-barriers