在内核中声明一个特定于线程的私有变量,然后将该变量返回给主机

时间:2013-06-06 10:30:31

标签: multithreading cudafy.net

我有一个方法,我想在几个线程上运行,但每个线程将返回不同数量的结果。是否可以声明一个私有的,特定于线程的变量,即一个列表然后我可以传回主机并合并所有结果?

说我有一个数组如下:

int[,] arr1 = new int[3,3] {{ 3, 4, 5 }, {4, 5, 6}, {1, 6, 4}};
int[] arr2 = new int[] { 3, 4, 1 };

每个线程将给出3个值来分析并记录arr2中的值与arr1中特定行的值之间的差异。

[Cudafy]
public static void CountAbove(GThread thread, int[] a, int[,] b, list<int> c)
{
    int tid = thread.blockIdx.x;
    int threshold = a[tid];

    for(int i = 0; i < b.GetLength(0); i++)
    {
    if (threshold < b[tid,i]) c.add(b[tid,i] - threshold);
    }
}   

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。在内核中声明局部变量对于您启动的每个线程都是私有的。因此,只需声明一个变量,使用它,当您想将结果存储在主机中时,将其复制到全局内存中。您可以为全局内存提供一个位置,将指针作为内核的参数传递给它。

示例:

__global__ void kernel(float *var)
{
 float localVar;//local to each thread in execution
 ...
 //Computation which uses localVar
 ...
 *var = localVar;
}

使用cudaMemcpy()将其收录在主机中后。如果声明本地数组,此示例也有效。在这种情况下,您只需复制一个数组而不是一个变量。

编辑#1:

将数组作为参数传递给内核的示例:

__global__ void kernel(float *arrayPtr, int length)
{
....
}

arrayPtr是一个应该在调用内核函数之前分配的devicePtr。 length是数组的大小。