如何在OpenCL中将char*转换为int*进行类型转换

3

请问有人知道如何在OpenCL内核函数中将char*指针转换为int*吗?我尝试过使用((int*) char_pointer),但它并不起作用。


2
你收到了什么错误信息? - user1202136
请确保在编译器中禁用严格别名,这种操作由于严格别名规则而不合法,但在大多数编译器中,您可以将其关闭。 - Šimon Tóth
/tmp/OCLqZ3crS.cl(710):错误:无效的类型转换 a [0] = *((int *)allocatedBuf); allocatedBuf 的类型为全局 char *。 - sahil
构建选项为:-fno-strict-aliasing 错误:Program::build() 失败。错误代码:CL_INVALID_BUILD_OPTIONS - sahil
我知道这个问题已经得到了回答并被接受,但出于兴趣,您确实是想将4个字节存储在地址allocatedBuf中作为一个int吗? - violet313
2个回答

12

我认为你需要用正确的地址空间来限定指针。

如果你不指定地址空间,__private 会被默认使用,但是根据你的评论中显示,你的源指针似乎是一个 __global 指针,因此地址空间是不兼容的。

所以尝试使用 (__global int*) 而不只是 (int*)


0
将指针放入联合中,在char *中进行初始化,并在int *中使用:
 union {
     char *cp;
     int  *ip;
 } ptr;

 ptr.cp = allocatedBuf;
 a[0] = *(ptr.ip);

虽然不太美观,但至少在C语言中可以完成任务而无需转换。这是未定义的行为,但嘿,你不会在心脏监护仪或核弹头的另一端使用它,对吧?


1
如果代码被开源,有一天某个公司在核电站中使用它会发生什么? - hochl
我认为这甚至不是未定义行为,因为OpenCL C明确允许读取与最后写入的成员不同的联合成员(至少如果大小匹配,这里就是这种情况)。这可能甚至适用于基于C99的OpenCL C,但我对此不确定。但无论如何,这都无法解决他的问题,因为问题在于地址空间不匹配。 - Christian Rau
他们不能责怪我,因为我已经告诉过他们了。说真的,与被接受答案中的转换一样,同样的事情会发生。使用对齐不正确的指针总是在自讨苦吃。 - Jens
@Jens 啊,是的,我没有考虑对齐。好吧,那么它确实可能是未定义行为。让我们希望他正确地处理了对齐(或者我们摆脱核电站,直到有人发现他的代码,即使只是因为这个原因)。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接