【问题标题】:aparapi start index of getGlobalId()getGlobalId() 的 aparapi 起始索引
【发布时间】:2013-03-18 21:57:27
【问题描述】:

我使用 aparapi 进行并行化,我想转换这个 java 代码:

public static void main(String[] args) {
        float res = 0;
        for (int i = 2; i < 5; i++) {
            for (int j = 3; j < 5; j++) {
                res += i * j;
            }
        }

        System.out.println(res);

    }

在 aparapi 中的等价物:

Kernel kernel = new Kernel() {
    @Override
    public void run() {
        int i = getGlobalId();
        ...
    }
};
kernel.execute();
kernel.dispose();

【问题讨论】:

  • 我的问题是如何设置星级和索引?

标签: aparapi


【解决方案1】:

这里有几个问题。

首先,您的代码不是数据并行的。您在“res”上有一个“竞态”条件,因此无法在 GPU 上计算此代码。

其次,执行范围太小。您正在尝试执行 6 个线程 (x [2,3,4] * y [3,4])。这不会真正从 GPU 中获得任何好处。

回答有关如何在上面的 2 个昏暗网格上实现的问题。

Range range = Range.create2D(3, 2) ; // A two dimension grid 3x2
Kernel kernel = new Kernel() {
    @Override
    public void run() {
        int x = getGlobalId(0)+2; // x starts at 2 
        int y = getGlobalId(1)+3; // y starts at 3
        ...
    }
};
kernel.execute(range);
kernel.dispose();

【讨论】:

  • 非常感谢gfrost,这只是理解它如何工作的一个例子,但是你能简单地解释一下为什么这段代码不是数据并行的吗?谢谢
  • 因为您的原始代码需要每个内部循环来更新“res”的值。因此,如果所有循环体都是并行实现的,它们都会“竞相”将它们的值添加到“res”,res 不会包含您想要的结果。您可以将 res 放入一个数组并使用 Aparapi 的 atomicInc(arr, index, value) 来增加它,但这会减慢您的执行速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2015-04-09
  • 2020-03-03
  • 2013-11-11
  • 2012-12-07
相关资源
最近更新 更多