首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于大型数组,RootBeer默默地失败了?

对于大型数组,RootBeer默默地失败了?
EN

Stack Overflow用户
提问于 2014-08-28 15:24:19
回答 1查看 80关注 0票数 2

我有一个简单的应用程序(目前)在一个大数组中模拟错误校正。

此位将生成数据,并将16个字节的里德-所罗门奇偶校验添加到每个255个字节的块中。

代码语言:javascript
复制
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;
}

这是我的内核:

代码语言:javascript
复制
public class RsKernel implements Kernel {
    private final int[] block;

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

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

它只是手动地恢复每个块中损坏的字节(它不进行实际的里德-所罗门纠错)。

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

代码语言:javascript
复制
ArrayList<Kernel> kernels = new ArrayList<>(params.getNumBlocks());
for (int[] block : data) {
    kernels.add(new RsKernel(block));
}
new Rootbeer().run(kernels);

我用JUnitassertArrayEquals来验证解码。

代码语言:javascript
复制
Assert.assertArrayEquals(original, data);

奇怪的一点是,如果我使用最多8192个块(多么方便的数目)运行这段代码(内核),据报告数据已被正确解码;对于8193个及以上的块,正确解码的是而不是

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
device count: 1
device: GeForce GT 525M
  compute_capability: 2.1
  total_global_memory: 1073414144 bytes
  num_multiprocessors: 2
  max_threads_per_multiprocessor: 1536
  clock_rate: 1200000 Hz
EN

回答 1

Stack Overflow用户

发布于 2014-08-28 15:52:09

看一下代码,我想可能是因为以下几点:

代码语言:javascript
复制
// Corrupt a byte
block[50] += 1;

可以将一个字节添加到255中,从而获得256个字节,这将不是一个有效字节。使用这样的方法,破坏字节可能会更好:

代码语言:javascript
复制
block[50] ^= 0x40;

这将翻转位置7的位,而不是添加破坏字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25552525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档