我有一个在不同数组中搜索的内核(每个数组一个线程),我需要总是一个线程找到匹配,结果将写入全局内存数组。问题是如何在不在相同位置写入两次或将位置留空的情况下访问此全局数组?
这是我尝试做的伪代码示例:
__global__ void find(*TableOfArrays, *Result, position)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < numOfArrays)
{
for (int i = 0; i < tableOfArrays[idx].lenght; i++)
{
if (Match(tableOfArrays[idx][i]))
{
//The position variable gives me the position of the global array.
atomicAdd(&(position), (int)1);
//I want to write each result in one space of the array Result
Result[position] = tableOfArrays[idx][i];
}
}
}
}
问题是线程无法按顺序访问Result数组,并且某些线程占用相同的空间...任何帮助??你呢。
答案 0 :(得分:2)
当atomicAdd读取内存时,必须取变量的值,执行atomicAdd后,另一个线程可以访问内存并修改它。
int localIndex = atomicAdd(&(position), (int)1);
Result[localIndex] = tableOfArrays[idx][i];