当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最多只是大到足以导致溢出)
上下文:我想检查每个32位int x
,其中x % q == r
,其中q
和r
是已知的。对于向量,我可以一次检查4个,但测试的次数可能不能被4整除。
我的目标是GPU,但这不应该是相关的,对吗?
OpenCL 1.2标准(章节6.2.3.3)指的是C99标准(章节6.3.1.3):
…如果新类型为无符号类型,则通过重复添加或来转换值在新类型中可以表示的最大值之外减去一个直到值在新类型的范围内。
一般来说,get_global_id返回size_t,所以窄化转换在我看来是个坏主意。不过,我从来没有遇到过大到足以超过int范围的nrange