对于大型数组,RootBeer会无声地失败?

时间:2014-08-28 15:24:20

标签: cuda rootbeer

我有一个简单的应用程序(现在)模拟大型数组中的纠错。

该位生成数据,并为每个255字节的块添加16字节的Reed-Solomon奇偶校验。

ReedSolomonEncoder encoder = new ReedSolomonEncoder(QR_CODE_FIELD_256);
int[][] data = new int[params.getNumBlocks()][255];
int[][] original = new int[params.getNumBlocks()][];

int value = 0;
for (int i = 0; i < params.getNumBlocks(); i++) {
    int[] block = data[i];
    for (int j = 0; j < 239; j++) {
        value = (value + 1) % 256;
        block[j] = value;
    }
    encoder.encode(block, 16);
    original[i] = Arrays.copyOf(block, block.length);

    // Corrupt a byte
    block[50] += 1;
}

这是我的核心:

public class RsKernel implements Kernel {
    private final int[] block;

    public RsKernel(int[] block) {
        this.block = block;
    }

    @Override
    public void gpuMethod() {
        block[50] -= 1;
    }
}

它只是手动恢复每个块中的损坏字节(它不会进行实际的Reed-Solomon纠错)。

我使用以下代码运行内核:

ArrayList<Kernel> kernels = new ArrayList<>(params.getNumBlocks());
for (int[] block : data) {
    kernels.add(new RsKernel(block));
}
new Rootbeer().run(kernels);

我使用JUnit的{​​{1}}验证解码:

assertArrayEquals

奇怪的是,如果我运行这个代码最多8192(多么可疑的数字)块(内核),报告数据已被正确解码;对于8193个及以上的块,正确解码:

Assert.assertArrayEquals(original, data);

什么可能导致这种行为?

以下是Exception in thread "main" arrays first differed at element [8192][50]; expected:<51> but was:<52> at org.junit.Assert.internalArrayEquals(Assert.java:437) at org.junit.Assert.internalArrayEquals(Assert.java:428) at org.junit.Assert.assertArrayEquals(Assert.java:167) at org.junit.Assert.assertArrayEquals(Assert.java:184) at com.amphinicy.blink.rootbeer.RootBeerDemo.main(Jasmin) 的输出:

java -jar rootbeer-1.1.14.jar -printdeviceinfo

1 个答案:

答案 0 :(得分:1)

查看代码,我认为可能因为以下内容:

// Corrupt a byte
block[50] += 1;

可以添加1到255,给出256不是有效字节。使用类似的方法破坏字节可能会更好:

block[50] ^= 0x40;

这会将位置7中的位翻转而不是添加以破坏该字节。