我有一个简单的应用程序(目前)在一个大数组中模拟错误校正。
此位将生成数据,并将16个字节的里德-所罗门奇偶校验添加到每个255个字节的块中。
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;
}
}它只是手动地恢复每个块中损坏的字节(它不进行实际的里德-所罗门纠错)。
我使用以下代码运行内核:
ArrayList<Kernel> kernels = new ArrayList<>(params.getNumBlocks());
for (int[] block : data) {
kernels.add(new RsKernel(block));
}
new Rootbeer().run(kernels);我用JUnit的assertArrayEquals来验证解码。
Assert.assertArrayEquals(original, data);奇怪的一点是,如果我使用最多8192个块(多么方便的数目)运行这段代码(内核),据报告数据已被正确解码;对于8193个及以上的块,正确解码的是而不是:
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的输出
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发布于 2014-08-28 15:52:09
看一下代码,我想可能是因为以下几点:
// Corrupt a byte
block[50] += 1;可以将一个字节添加到255中,从而获得256个字节,这将不是一个有效字节。使用这样的方法,破坏字节可能会更好:
block[50] ^= 0x40;这将翻转位置7的位,而不是添加破坏字节。
https://stackoverflow.com/questions/25552525
复制相似问题