在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开始)。
答案 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;}