擬似コード
謎の表の順番で更新すれば1ワード1ロードにできるのを擬似コードにしてみた。
ベクトル化はなし。
#define N 624 #define N 397 word mt[N]; word mtx[N]; void transform(word dst[N], word src[N]) { for (int i = 0; i < N; i++) { // 謎の表の通りに並び替える // dst[0] = src[509] // dst[1] = src[282] // ... dst[i] = src[(509 + i * M) % N]; } } word f(word x0, word x1, word xM) { word y = (x0&UPPER_MASK)|(x1&LOWER_MASK); return xM ^ (y >> 1) ^ mag01[y & 0x1UL]; } unsigned int genrand_mine(int num_rand) { transform(mtx, mt); for (num_rand) { // 最初の行の一つ上の行をロード word mt510 = mtx[(607 + 510 * 613) % N]; // mt[510] word mt283 = mtx[(607 + 283 * 613) % N]; // mt[283] word mt56 = mtx[(607 + 56 * 613) % N]; // mt[ 56] word mt453 = mtx[(607 + 453 * 613) % N]; // mt[453] word mt226 = mtx[(607 + 226 * 613) % N]; // mt[226] word mt623 = mtx[(607 + 623 * 613) % N]; // mt[623] word mt396 = mtx[(607 + 396 * 613) % N]; // mt[396] word mt169 = mtx[(607 + 169 * 613) % N]; // mt[169] word mt566 = mtx[(607 + 566 * 613) % N]; // mt[566] word mt339 = mtx[(607 + 339 * 613) % N]; // mt[339] word mt112 = mtx[(607 + 112 * 613) % N]; // mt[112] word mt509 = mtx[(607 + 509 * 613) % N]; // mt[509] for (int i = 0; i < 56; i++) { // i行目をロード word mt282 = mtx[11 * i + 1]; word mt55 = mtx[11 * i + 2]; word mt452 = mtx[11 * i + 3]; word mt225 = mtx[11 * i + 4]; word mt622 = mtx[11 * i + 5]; word mt395 = mtx[11 * i + 6]; word mt168 = mtx[11 * i + 7]; word mt565 = mtx[11 * i + 8]; word mt338 = mtx[11 * i + 9]; word mt111 = mtx[11 * i + 10]; word mt508 = mtx[11 * i + 11]; // i行目を更新。順番に注意 word mt55n = f(mt55, mt56, mt452); word mt225n = f(mt225, mt226, mt622); word mt168n = f(mt168, mt169, mt565); word mt111n = f(mt111, mt112, mt508); word mt282n = f(mt282, mt283, mt55n); word mt452n = f(mt452, mt453, mt225n); word mt395n = f(mt395, mt396, mt168n); word mt338n = f(mt338, mt339, mt111n); word mt509n = f(mt509, mt510, mt282n); word mt622n = f(mt622, mt623, mt395n); word mt565n = f(mt565, mt566, mt338n); // 更新した結果を保存 mtx[11 * i + 0] = mt509n; mtx[11 * i + 1] = mt282n; mtx[11 * i + 2] = mt55n; // 略 mtx[11 * i + 10] = mt111n; // 一行ずらして、次の行の更新へ mt510 = mt509; mt283 = mt282; mt56 = mt55; // 略 mt112 = mt111; mt509 = mt508; } // 残り8ワードの処理 // ... // temperingと和 // ... } }
で、i=0..13, 14..27, 28..41, 42..56 は並列に実行できるからベクトル化は簡単にできるーね。