2

(今のところ)大規模な配列でエラー修正をシミュレートする単純なアプリケーションがあります。

このビットはデータを生成し、255 バイトの各ブロックに 16 バイトのリードソロモン パリティを追加します。

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そして、私は'sでデコードを検証し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
4

1 に答える 1

1

コードを見ると、次のことが原因である可能性があると思います。

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

255 に 1 を加算すると、有効なバイトではない 256 になります。バイトの破損は、次のようなものでうまくいくかもしれません:

block[50] ^= 0x40;

これは、バイトを破損するために追加するのではなく、位置 7 のビットを反転させます。

于 2014-08-28T15:52:09.200 に答える