【问题标题】:Custom reduction on GPU vs CPU yield different resultGPU与CPU的自定义减少产生不同的结果
【发布时间】:2017-07-27 17:48:42
【问题描述】:

为什么我在 GPU 上看到的结果与顺序 CPU 不同?

import numpy
from numba import cuda
from functools import reduce

A = (numpy.arange(100, dtype=numpy.float64)) + 1
cuda.reduce(lambda a, b: a + b * 20)(A) 
# result 12952749821.0
reduce(lambda a, b: a + b * 20, A) 
# result 100981.0

import numba
numba.__version__
# '0.34.0+5.g1762237'

使用 Java Stream API 并行减少 CPU 时会发生类似的行为:

int n = 10;
float inputArray[] = new float[n];
ArrayList<Float> inputList = new ArrayList<Float>();
for (int i=0; i<n; i++)
{
    inputArray[i] = i+1;
    inputList.add(inputArray[i]);
}
Optional<Float> resultStream = inputList.stream().parallel().reduce((x, y) -> x+y*20);
float sequentialResult = array[0];
for (int i = 1; i < array.length; i++)
{
    sequentialResult = sequentialResult + array[i] * 20;            
}
System.out.println("Sequential Result "+sequentialResult); 
// Sequential Result 10541.0
System.out.println("Stream Result "+resultStream.get()); 
// Stream Result 1.2466232E8

【问题讨论】:

  • 只是为了帮助弄清楚可能发生的事情,如果您的 arange 是 3 而不是 10,这会重现吗?
  • 不,3个都给出相同的答案

标签: python lambda gpu numba reduction


【解决方案1】:

似乎,正如Numba's team 所指出的,lambda a, b: a + b * 20 不是 associative and commutative 减少函数,它会产生这种意想不到的结果。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2015-07-24
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多