monte carlo 锁定random seed后部分结果不稳定

各位大神好,本人taichi新手上路摸索中。

在尝试用taichi编写一个随机模拟数值计算的算法中 遇到了一些问题。
算法结构大致如下:

def pythonscopeFun(params):
       datafield1 = ti.field(float,(N,))
       datafield2 = ti.field(float,(N,))
       np.random.seed(random_seed_number)
       random_number = np.random.uniform(0,1,(N,m))

      @ti.kernel
      def kernel_fun(params):
          total_value = .0
          for i in range(N):
              datafield1[i] = params[0]
              datafield2[i] = params[1]
              for j in range(m):
                  datafield1[i] =some_func(datafield1[i] ,random_number[i,j])
                  datafield2[i] =some_other_func(datafield1[i] ,datafield2[i] )
                  total_value+= datafield2[i]
          return total_value/N
      
      rslt = kernel_fun(params)
      params2 = func(params)
      rslt2 = kernel_fun(params2)

目前如果函数中直接调用多次kernel_fun的话 会出现计算结果每次不完全相同,但是奇怪的是计算结果又是在一个有限集合中产生。。。我猜是否是因为两次调用kernel_fun 共用了相同的field 而第一次调用kernel fun时计算并未完成便开始了第二次调用kernel fun 导致两个函数之间发生了串内存之类的事。

第二个我不太确定的问题是,即使我comment掉rslt2 这次调用kernel_fun, 结果仍然会出现不稳定的特点,但是绝大部分情况下 计算结果是在小数点后第8位数以后开始不一致,是否是因为单精度计算本来就是有这种问题呢?

实在是懵逼呀 求教求指导。感谢

你好,你的原问题中代码部分使用的是普通文本,阅读起来很不方便,我编辑了一下,但是恐怕和你的原意有出入,你可否更新一下代码的部分?最好能提供一个最小的我们可复现的例子。

并行计算时累加结果的顺序是不确定的,而浮点数类型在交换相加顺序之后有可能会出现精度误差。我不确定这份代码是不是由这个原因导致的,你可以试试去掉 random 函数后再看看是否会出现结果不稳定的现象。

感谢回复,去掉随机项后运算结果就都是一样的了,目前代码结果有时一样有时不一样,比较奇怪,极个别的时候10次计算还能都一样。。。比如这样

0.9996213316917419
0.9996213316917419
0.9996211528778076
0.9996215105056763
0.9996213316917419
0.9996212124824524
0.9996213316917419
0.9996212124824524
0.9996213316917419
0.9996213316917419

感谢回复, 我没弄明白咋编辑代码格式 我看你的是 ‘’‘python ’‘’ 我这样弄了也不行,不知道为啥

可以尝试在kernel_funcfor i in range(N)上面加上ti.loop_config(serialize=True),看看串行的结果会不会有问题