如何在OpenCL中定义uint溢出?

时间:2014-05-29 10:25:45

标签: opencl integer-overflow

当OpenCL中的乘法或求和结果溢出时会发生什么?它包裹吗?

特别是我想知道我是否可以在

中发现溢出

uint4 x = ( get_global_id( 0 ) * 4 + (uint4)(0, 1, 2, 3) ) * q + r;

int4 invalid = x < get_global_id( 0 ) * 4;

或其他可能的方式。 (假设r >= 0 && q > r && q < (1 << 20)并且id最多只会大到足以导致溢出。)

上下文:我想检查x的每个32位uint x % q == r,其中qr已知。使用向量,我可以一次检查4个,但测试数量可能无法被4整除。

我的目标是GPU,但这不应该是相关的,对吗?

1 个答案:

答案 0 :(得分:0)

OpenCL 1.2标准(第6.2.3.3节)是指C99标准(第6.3.1.3节):

  

...如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内。

通常,get_global_id返回size_t,因此缩小转换是个坏主意IMO。虽然,我从来没有遇到过足以超过uint范围的NDRange。