我正在尝试执行以下操作(简化):请阅读编辑部分!
__shared__ int currentPos = 0;
__global__ myThreadedFunction(float *int, float *out)
{
// do calculations with in values
...
// now first thread reach this:
//suspend other threads up here
out += currentPos;
for (int i = 0; i < size; ++i)
{
*(currentPos++) = calculation[i];
}
currentPos += size;
// now thread is finish, other threads can
// go on with writing
}
那么如何在写入相同的内存之前挂起线程呢?我不能同时写,因为我不知道每个计算数组的大小(calculation[i] - size)。
我知道有同步线程和线程围栏,但我不知道如何正确使用它们来解决这个问题。
编辑: 我想做的是:
我有 2 个线程(仅作为示例)。每个线程都在一个新数组中使用浮点数*进行计算。
线程 1 计算:{ 1, 3, 2, 4 }
线程 2 计算:{ 3, 2, 5, 6, 3, 4 }
这些数组的大小在计算后是已知的。现在我想在 float *out 中写入这些数组。
如果第一个线程 1 或线程 2 正在写入,对我来说没有必要。输出可能是: * { 1, 3, 2, 4, 3, 2, 5, 6, 3, 4 } 或 { 3, 2, 5, 6, 3, 4, 1, 3, 2, 4} *
那么如何计算输出数组的位置呢?
我不想使用固定的“数组大小”,以便输出为: * { 1, 3, 2, 4, ?, ?, 3, 2, 5, 6, 3, 4 } *
我想我可以为下一个写作位置使用一个共享变量 POSITION。
线程 1 到达写入点(计算新数组后)。线程 1 在共享变量 POSITION 中写入他的数组大小 (4)。
当线程 1 现在将他的临时数组写入输出数组时,线程 2 读取变量 POSITION 并添加他的 tmp。数组大小 (6) 到这个变量,并从线程 1 结束的位置开始写入
如果有线程 3,他还将读取 POSITION,添加他的数组大小并写入输出,线程 2 结束
所以有人有想法吗?