我是Opencl编程的新手。为了更好地学习opencl,花了一些时间阅读一些教程后,我开始开发一个简单的模式匹配内核函数。但我有些疑惑:
首先,我在内核函数中声明了全局变量。这是否意味着每个工作项共享每个变量的单个副本?
其次,我如何使用标准C库,尤其是" string.h中&#34 ;.
__kernel void matchPatterns_V1(__global char *strings, __global char *patterns, __global int *matchCount,
int strCount, int strLength, int patCount, int patLength) {
int id = get_global_id(0);
int rowIndex = id*strLength;
int i, matches = 0;
__global char *pos = strings;
__global char *temp = strings;
__global char *pat = patterns;
for(i = 0; i < patCount; i++)
{
temp = &strings[rowIndex];
pat = &patterns[i*patLength];
while(pos != '\0') {
pos = StrStr(temp, pat);
if(pos != '\0') {
matches++;
temp = pos + patLength;
}
}
}
matchCount[id] = matches;
}
总而言之,每个工作项目是否都有自己的变量副本&#39; pos&#39;,&#39; temp&#39;和&#39; pat&#39;?
任何学习Opencl的建议都受到高度赞赏,包括对最佳书籍/教程网站的建议。
答案 0 :(得分:5)
不,它位于全局内存空间中,因此通常每个内核调用一个副本,由所有工作项共享。如果不能保证每个工作组在全局内存中都有自己独特的“项” - 或者更一般地说,内核中没有两个工作项同时写入内存中的同一位置,那么写入全局内存是危险的。因为会有竞争条件。
如果您只是从这些全局内存变量中读取数据,那当然无关紧要。
您还无法在内核中声明__global
变量,因为它们仅是内核参数。如果您尝试这样做,您将从OpenCL编译器中获得以下内容:
error: global variables cannot be allocated inside kernel code
有充分的理由,除非技术不可能:全局变量根本没有任何意义......我能想到的唯一可能的原因是工作项之间的沟通,这将是一种疯狂的设计模式。
关于您的问题,请在评论中参考OpenCL规范第6.5节中的这个片段:
// declares a pointer p in the __private address space that
// points to an int object in address space __global
__global int *p;
因此,与指针类型相关联的内存空间表示它们指向的变量的内存空间,而不是指针本身,它们总是__private
(即每个工作项)。
您不能在OpenCL中使用标准C库中的字符串操作函数,但如果您愿意,可以将它们重新编码为在GPU上使用(大部分都难以实现)。