Parallel processing 在全局地址空间中维护opencl内核函数中声明的全局变量的多少个副本

Parallel processing 在全局地址空间中维护opencl内核函数中声明的全局变量的多少个副本,parallel-processing,opencl,Parallel Processing,Opencl,我是Opencl编程新手。为了更好地学习opencl,在花了一些时间阅读了一些教程之后,我开始开发一个简单的模式匹配内核函数。但我有一些疑问: 首先,我在内核函数中声明了全局变量。这是否意味着每个工作项共享每个变量的一个副本 第二,如何使用标准C库,特别是“string.h” \uuuuu内核无效匹配模式\uv1(\uuuu全局字符*字符串,\uuuu全局字符*模式,\uuuu全局整型*匹配计数, 整数strCount、整数strLength、整数patCount、整数patLength){ i

我是Opencl编程新手。为了更好地学习opencl,在花了一些时间阅读了一些教程之后,我开始开发一个简单的模式匹配内核函数。但我有一些疑问:

首先,我在内核函数中声明了全局变量。这是否意味着每个工作项共享每个变量的一个副本

第二,如何使用标准C库,特别是“string.h”

\uuuuu内核无效匹配模式\uv1(\uuuu全局字符*字符串,\uuuu全局字符*模式,\uuuu全局整型*匹配计数,
整数strCount、整数strLength、整数patCount、整数patLength){
int id=获取全局id(0);
int rowIndex=id*strLength;
int i,匹配项=0;
__全局字符*pos=字符串;
__全局字符*临时=字符串;
__全局字符*pat=模式;
对于(i=0;i
总而言之,每个工作项是否都有自己的变量“pos”、“temp”和“pat”副本


非常感谢学习Opencl中的任何建议,包括关于最佳书籍/教程站点的建议。

不,它位于全局内存空间中,因此通常每个内核调用都有一个副本,供所有工作项共享。如果您不能保证每个工作组在全局内存中都有自己独特的“项”(或者更一般地说,内核中没有两个工作项会同时写入内存中的同一位置),那么写入全局内存是危险的,因为会存在争用条件

当然,如果您只是从这些全局内存变量中读取数据,这并不重要

您也不能在内核中声明
\uu 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;
因此,与指针类型相关联的内存空间表示它们指向的变量的内存空间,而不是指针本身,它们总是
\uu private
(即每个工作项)



您不能在OpenCL中使用标准C库中的字符串操作函数,但如果您愿意,可以重新编码它们以在GPU上使用(它们中的大多数几乎不难实现)。

不,它位于全局内存空间中,因此通常每个内核调用都有一个副本,供所有工作项共享。如果您不能保证每个工作组在全局内存中都有自己独特的“项”(或者更一般地说,内核中没有两个工作项会同时写入内存中的同一位置),那么写入全局内存是危险的,因为会存在争用条件

当然,如果您只是从这些全局内存变量中读取数据,这并不重要

您也不能在内核中声明
\uu 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;
因此,与指针类型相关联的内存空间表示它们指向的变量的内存空间,而不是指针本身,它们总是
\uu private
(即每个工作项)



您不能在OpenCL中使用标准C库中的字符串操作函数,但如果您愿意,可以将其重新编码以在GPU上使用(其中大多数几乎不难实现)。

感谢您的回复。只要变量是指针,就允许在内核中声明_全局变量type@khalil是的,当然,在这种情况下,不是指针具有_全局属性,而是指向的变量(就像int8_t*ptr是指向C中8位整数的指针,而不是8位指针)因此,您并没有真正分配任何内容。如果是,这是否意味着内核中的声明(如u global*temp)对于每个工作项都是唯一的?类似于C函数中的局部变量声明。感谢您的回复。只要变量是指针,就允许在内核中声明_全局变量type@khalil是的,当然,在这种情况下,不是指针具有_全局属性,而是指向的变量(就像int8_t*ptr是指向C中8位整数的指针,而不是8位指针)因此,您并没有真正分配任何内容。如果是,这是否意味着内核中的声明(如u global*temp)对于每个工作项都是唯一的?类似于C函数中的局部变量声明。