当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
,其中q
和r
已知。使用向量,我可以一次检查4个,但测试数量可能无法被4整除。
我的目标是GPU,但这不应该是相关的,对吗?
答案 0 :(得分:0)
OpenCL 1.2标准(第6.2.3.3节)是指C99标准(第6.3.1.3节):
...如果新类型是无符号的,则通过重复添加或转换该值 减去一个可以在新类型中表示的最大值 直到该值在新类型的范围内。
通常,get_global_id返回size_t,因此缩小转换是个坏主意IMO。虽然,我从来没有遇到过足以超过uint范围的NDRange。