Java JOCL Char未返回所有Char
为什么它不能为数组中的每一个生成一个q,问号是什么?我试着改变一些东西,比如Java JOCL Char未返回所有Char,java,opencl,gpgpu,jocl,Java,Opencl,Gpgpu,Jocl,为什么它不能为数组中的每一个生成一个q,问号是什么?我试着改变一些东西,比如intgid=get\u global\u id(0)tointgid=get_global_id(1)最终的结果是类似于[q,,,,,,…]和[m,,,,,…]。有人能解释一下这一点,以及如何将多个chars作为输入传递给OpenCL内核吗 [?, ?, ?, ?, ?, ?, ?, ?, q, , , , , , , , ] [?, ?, ?, ?, ?, ?, ?, ?, m, , , ,
intgid=get\u global\u id(0)
tointgid=get_global_id(1)代码>最终的结果是类似于[q,,,,,,…]
和[m,,,,,…]
。有人能解释一下这一点,以及如何将多个char
s作为输入传递给OpenCL内核吗
[?, ?, ?, ?, ?, ?, ?, ?, q, , , , , , , , ]
[?, ?, ?, ?, ?, ?, ?, ?, m, , , , , , , , ]
这是可以的,除了缓冲区副本
int n = 17;
这将读取8.5个char
值或17个字节。java字符(2字节)和设备端字符(1字节)之间不匹配
这就是为什么您在第17个字节或第9个元素处看到正确的q
java布尔数组也会出现类似的错误
同样,uchar16表示16字节
clEnqueueReadBuffer(commandQueue, memObjects[3], CL_TRUE, 0,
n * Sizeof.cl_char, cArr, 0, null, null);
这需要乘以16,除非每个元素对所有16个元素都有效。如果您的意思是每16个字节包含17个元素,那么n*16应该存在,主机端(java)应该给出字节数组
这是可以的,除了缓冲区副本
int n = 17;
这将读取8.5个char
值或17个字节。java字符(2字节)和设备端字符(1字节)之间不匹配
这就是为什么您在第17个字节或第9个元素处看到正确的q
java布尔数组也会出现类似的错误
同样,uchar16表示16字节
clEnqueueReadBuffer(commandQueue, memObjects[3], CL_TRUE, 0,
n * Sizeof.cl_char, cArr, 0, null, null);
这需要乘以16,除非每个元素对所有16个元素都有效。如果您的意思是每16个字节包含17个元素,那么n*16应该在那里,主机端(java)应该给出字节数组。最重要的一点已经在以下内容中提到:
javachar
由2字节(16位)组成。在C和OpenCL中,字符是一个字节(8位)
现在还不完全清楚您的程序最终应该做什么,但正如huseyin所说的:我很确定您打算使用char2
而不是char16
(假设这是与UTF16相关的程序,否则,主机代码就没有意义)。此外,您似乎以某种方式混合了输入和输出数组
注:
如果您现在将其更改为使用uchar2
,您还可能会遇到OpenCL的限制:
大小小于32位的内置类型,即char、uchar、char2、uchar2、short、ushort和half具有以下限制:
写入类型为char、uchar、char2、uchar2、short、ushort和half的指针(或数组)不受支持
如果您能更清楚地描述程序应该做什么(并在这里给我一个注释,作为评论),我将尝试添加一个小示例,演示如何实现这一点。最重要的一点已经在:
javachar
由两个字节(16位)组成。在C和OpenCL中,字符是一个字节(8位)
现在还不完全清楚您的程序最终应该做什么,但正如huseyin所说的:我很确定您打算使用char2
而不是char16
(假设这是与UTF16相关的程序,否则,主机代码就没有意义)。此外,您似乎以某种方式混合了输入和输出数组
注:
如果您现在将其更改为使用uchar2
,您还可能会遇到OpenCL的限制:
大小小于32位的内置类型,即char、uchar、char2、uchar2、short、ushort和half具有以下限制:
写入类型为char、uchar、char2、uchar2、short、ushort和half的指针(或数组)不受支持
如果您更清楚地描述程序应该做什么(并在这里给我一个注释,作为注释),我将尝试添加一个小示例,演示如何实现这一点。那么我将如何向内核输入字符?如果这些字符始终是ascii字符,您可以使用字节数组。否则,将更多字节复制到缓冲区或从缓冲区复制更多字节。因此,在内核的参数中,我应该放入u global byte*sharedByte
?内核很好,我只需要更改char dstary[]=new char[n]代码>到字节数组[]=新字节[n]代码>?是和控制两侧都不超出范围。那么我如何向内核输入字符呢?如果这些字符始终是ascii字符,您可以使用字节数组。否则,将更多字节复制到缓冲区或从缓冲区复制更多字节。因此,在内核的参数中,我应该放入u global byte*sharedByte
?内核很好,我只需要更改char dstary[]=new char[n]代码>到字节数组[]=新字节[n]代码>?是,控制两侧不超出范围。它应该接受4个输入,3个char
s和1个float
。它根据浮点数返回后面的字母。例如,如果输入是('a','m','t',2)
,输出将是('c','o','v')
,因为'a'后面是2,'o'后面是'm'后面的2,'v'后面是't'。AlexJone你可以或应该通过编辑它在问题本身中描述这一点。在那里,你也有更多的空间比这里的评论。仍然不清楚您为什么使用char16
。现在,我不知道为什么要将两个float
数组传递给内核,当你说只需要1个float时…它应该接受4个输入,3个char
s和1个float
。它根据浮点数返回后面的字母。例如,如果输入是('a','m','t',2)
,那么输出将是('c','o','v')
,因为'a'后面是2,'o'后面是'm'后面的2,'v'后面是't'。AlexJone你可以或者应该在任务中描述这一点