M2 渡邉くん
プロジェクト案
- ClightプログラムからCoqを用いて正しさの保証された順方向,逆方向,コミットの3コードを生成する → 没
- PerumallaらのRCCを追試して正しさの保証や効率化をし評価する @github → 没
- 命令型プログラミング言語におけるプログラム可逆化(学位論文計画書)
- 中間審査までには限定した目標を達成する:1事例について,数個の規則のみを対象,可逆化システムの設計や実装は行わない,正しさの証明は行わない,可逆化規則を定め手で可逆化を行う,RCCの変換を手動で適用する,Backstrokeは用いない,Janus2C++は調査しない
- 2020/08/25の方針
- 局所変数を記憶しなくて良い場合
- 制御情報の圧縮
- (中間審査まではやらない:算術符号を応用する)
- switchの例
- 三重ループ(Glueckらの論文のもの)
- 手動でプログラムを作成
- メモリ使用量を手動で計算する(解析でOK)
TODO
- 修士論文執筆
- 計算の可逆性についてを追記
- PDESの可逆化に関する関連研究を追記
効率化に関するアイデアのメモ
2020/08/17TY:末尾再帰の可逆化変換の効率化
/* original */
T_0 f(T_1 a_1, T_2 a_2, ..., T_n a_n) {
if (e1) {
return e2;
} else {
P /* return を含まないものとする */
return f(a_1, a_2, ..., a_n);
}
}
/* fwd S=O(n) */
T_0 f(T_1 a_1, T_2 a_2, ..., T_n a_n) {
SAVE(0);
while (1) {
if (e1) {
return e2;
} else {
P_fwd
SAVE(1);
}
}
}
/* bwd */
void f(T_1 a_1, T_2 a_2, ..., T_n a_n) {
RESTORE(c)
while (c) {
P_bwd
RESTORE(c)
}
}
/* fwd optimized S=O(log n) */
T_0 f(T_1 a_1, T_2 a_2, ..., T_n a_n) {
int c = 0;
while (1) {
if (e1) {
SAVE(c);
return e2;
} else {
P_fwd
c++;
}
}
}
/* bwd optimized */
void f(T_1 a_1, T_2 a_2, ..., T_n a_n) {
RESTORE(c)
while (c--) {
P_bwd
}
}
2020/08/18TY: swap two integer variables (→ ポインタ変数の仮引数に関する規則に一般化)
/* original */
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void swap_fwd(int *xp, int *yp)
{
int temp = *xp;
SAVE(*xp);
*xp = *yp;
SAVE(*yp);
*yp = temp;
SAVE(temp);
}
/* reversible */
void swap_rev(int *xp, int *yp)
{
*xp ^= *yp;
*yp ^= *xp;
*xp ^= *yp;
}
Torbenの論文(暗号化)の例について...
/* original */
T f(T_1 a_1[], ...)
{
T_1 v_1, v_2, ...;
...
a[n_i] = v_i;
a[n_j] = v_j;
}
/* fwd optimized */
T_0 f_fwd(T_1 a_1, T_2 a_2, ..., T_n a_n) {
T_1 ..., v_i=a[n_i], ..., v_j=a[n_j], ...;
...
a[n_i] = v_i;
...
a[n_j] = v_j;
}
/* bwd optimized */
T_0 f_bwd(T_1 a_1, T_2 a_2, ..., T_n a_n) {
T_1 ..., v_i=a[n_i], ..., v_j=a[n_j], ...;
v_j = a[n_j];
...
v_i = a[n_i];
...
a[n_j]=v_j;
...
a[n_i]=v_i;
...
}
/* 適用例, さらに上書きされない局所変数はSAVEしない,厳密な規則は要検討 */
/* Mogensen T.Æ. (2019) Hermes: A Reversible Language for Writing Encryption Algorithms (Work in Progress). In: Bjørner N., Virbitskaite I., Voronkov A. (eds) Perspectives of System Informatics. PSI 2019. Lecture Notes in Computer Science, vol 11964. Springer, Cham. https://doi.org/10.1007/978-3-030-37487-7_21 */
void encrypt(uint32_t v[2], uint32_t k[4]) {
uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */
uint32_t delta=0x9E3779B9; /* a key schedule constant */
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<32; i++) { /* basic cycle start */
sum += delta;
v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
} /* end cycle */
v[0]=v0; v[1]=v1;
}
void encrypt_fwd(uint32_t v[2], uint32_t k[4]) {
uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */
uint32_t delta=0x9E3779B9; /* a key schedule constant */
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<32; i++) { /* basic cycle start */
sum += delta;
v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
} /* end cycle */
SAVE(sum);
v[0]=v0; v[1]=v1;
}
void encrypt_bwd(uint32_t v[2], uint32_t k[4]) {
uint32_t v0=v[0], v1=v[1], sum, i;
uint32_t delta=0x9E3779B9;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
RESTORE(sum);
for (i=32; i>=0; --i) {
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
sum -= delta;
}
assert(sum==0);
v[1]=v1;
v[0]=v0;
}
/* encrypt_bwd は decrypt と一致することが期待される. */
void decrypt (uint32_t v[2], uint32_t k[4]) {
uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up; sum is 32*delta */
uint32_t delta=0x9E3779B9; /* a key schedule constant */
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<32; i++) { /* basic cycle start */
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
sum -= delta;
} /* end cycle */
v[0]=v0; v[1]=v1;
}
UNU.RANの例に対して...【TBA】
参考文献など
- [Moge19] Mogensen, T.Æ.: Hermes: A Reversible Language for Writing Encryption Algorithms (Work in Progress), Bjørner, N., Virbitskaite, I., Voronkov, A. (Eds.), Perspectives of System Informatics (PSI 2019), Lecture Notes in Computer Science, Vol.11964, Springer-Verlag (2019). https://doi.org/10.1007/978-3-030-37487-7_21
- CompCert project
- [BlLe09] Sandrine Blazy and Xavier Leroy. Mechanized semantics for the Clight subset of the C language. Journal of Automated Reasoning, 43(3):263--288, 2009.
プロジェクトのページのPDF
Clightの構文規則や意味論が参考になる. - JIS X 3010:2003 プログラム言語C
- ベンチマーク: PHOLD (classic) @github, EPHOLD
- [Fuji90] Fujimoto, R. M.: Parallel discrete event simulation, Commun ACM, Vol.33, No.10, pp.30–53(1990).
- [SOTG20] Schordan, M., Oppelstrup, T., Thomsen, M. K. and Glück, R.: Reversible Languages and Incremental State Saving in Optimistic Parallel Discrete Event Simulation. In Reversible Computation: Extending Horizons of Computing: Selected Results of the COST Action IC1405. (Ulidowski, I., Lanese, I., Schultz, U. P. and Ferreira, C., eds), pp. 187-207, Springer International Publishing, Cham(2020).
- Backstroke @github
- [HoUU07] James Hoey, Irek Ulidowski, Shoji Yuen: Reversing Imperative Parallel Programs, Proceedings EXPRESS/SOS 2017 (2017).
p.56 (7) ループでは真偽値を記憶