如何在cuda中声明一个静态变量

时间:2016-02-16 14:36:42

标签: cuda

在java中我们可以声明一个静态变量。也就是说,如果一个变量被声明为静态,那么该程序就是一样的。如果我在CUDA内核中声明一个变量,每个内核都会创建该变量(多个单独的副本)。

例如,如果" int x = 5"已初始化,如果我们启动两个内核。如果我们在一个内核中将x的值更改为6(x = 6)。此更改在其他内核中不可见(x的值仍为5)。

我想在CUDA中声明一个静态变量,每个内核应该能够访问该变量值,如果从一个内核对该变量进行了更改,它应该在其他内核中可见(如果x = 6合一)内核,其他内核应该更新为x = 6)。

我需要这样才能找到一个数字是否存在于矩阵中。例如,给出矩阵和要查找的数字(比如5)。

2 3 0 0 0

1 4 5 0 0

7 8 0 0 0

0 0 0 0 0

0 0 0 0 0

我应该得到yes,row = 1和col = 2(假设行和列从0开始)。

1 个答案:

答案 0 :(得分:2)

对于您描述的用例,可以使用__device__限定符创建可从设备代码访问的静态变量。请参阅documentation

此外,对于您描述的用例(线程间/块/内核通信),我还会使用volatile限定符标记该变量。请参阅documentation

这样的事情:

__device__ volatile int found = 0;

__device__ volatile bool found = false;

Here是编程指南中的一个示例,它使用此构造进行线程间通信。

然后,您可以从任何线程将该变量设置为1或true,然后再查询状态。

由于您的用例描述仅涉及将设置变量设置为单个值,因此无论使用哪个线程,都不会担心来自多个线程的同时访问,只要是唯一的操作你做的是写一个变量:

found = 1;

(对于这种特殊情况,volatile可能也没有必要,具体取决于您的确切用法。)

如果您知道只有一个线程会找到该项目,并且您还希望记录x,y坐标,那么这将是一个简单的扩展:

__device__ volatile int found = 0;
__device__ volatile int x = -1;
__device__ volatile int y = -1;

然后您的设备代码可能是:

if (item_found){
  found = 1;
  x = item.x;
  y = item.y;}