在 GPU 全局内存中存储选择性元素
Storing selective elements in GPU global memory
我们正在使用 CUDAfy.NET 在 GPU 上进行比较。为此,我们传递了两个数组,其中一个包含数据,另一个存储结果。
我只想将那些满足特定条件的元素存储在结果数组中。但是数组以不满足条件的不需要的条目结束。
如何从结果数组中过滤掉这些不需要的条目并将过滤后的数组 return 返回到主函数?
[Cudafy]
public static void Comparisons(GThread thread, int[] a,int[] c, int iter)
{
int tx = thread.threadIdx.x;
if(tx < iter)
{
if(a[tx] < tolerance) //tolerance is some user defined number
{
c[tx] = a[tx];
}
}
}
您必须在多个内核通道中执行此操作。
示例:
一 = [1,2,1,2,1,2]
公差 = 2
第一关:
创建一个数组,其中包含 "keep element" 的 1 或 "discard element"
的 0
p = [1,0,1,0,1,0]
第二遍:
对 p 数组执行并行前缀和。
我 = [0,1,1,2,2,3]
(有很多关于这个主题的白皮书)
第三遍:
使用 a、p 和 i。
每个元素一个线程。
如果 p[threadIdx.x] 等于 1 则将 a[threadIdx.x] 放入 c[i[threadIdx.x]]
(你可以在这里使用共享内存来更好地合并写入 c 数组)
结果数组 c 将包含 [1,1,1]
我们正在使用 CUDAfy.NET 在 GPU 上进行比较。为此,我们传递了两个数组,其中一个包含数据,另一个存储结果。 我只想将那些满足特定条件的元素存储在结果数组中。但是数组以不满足条件的不需要的条目结束。 如何从结果数组中过滤掉这些不需要的条目并将过滤后的数组 return 返回到主函数?
[Cudafy]
public static void Comparisons(GThread thread, int[] a,int[] c, int iter)
{
int tx = thread.threadIdx.x;
if(tx < iter)
{
if(a[tx] < tolerance) //tolerance is some user defined number
{
c[tx] = a[tx];
}
}
}
您必须在多个内核通道中执行此操作。
示例:
一 = [1,2,1,2,1,2]
公差 = 2
第一关:
创建一个数组,其中包含 "keep element" 的 1 或 "discard element"
的 0
p = [1,0,1,0,1,0]
第二遍:
对 p 数组执行并行前缀和。
我 = [0,1,1,2,2,3]
(有很多关于这个主题的白皮书)
第三遍:
使用 a、p 和 i。
每个元素一个线程。
如果 p[threadIdx.x] 等于 1 则将 a[threadIdx.x] 放入 c[i[threadIdx.x]]
(你可以在这里使用共享内存来更好地合并写入 c 数组)
结果数组 c 将包含 [1,1,1]