參考https://blog.csdn.net/kentyu001/article/details/54575876
const void *a中const修飾的是*a, 對象不可修改, 但指針可以指向別的對象殖告。在void* const a中侧但,const 修飾的是a, 是常量指針, 對象可以修改, 但指針內(nèi)的地址不可修改
const void* const* inputs是一個二維指針數(shù)組, 里外均為const的. 其指針元素為const void*, 像普通的指針一樣. 只是對于里外都不可修改的才要加兩個const去修飾
void* const* outputs只加了一個const, 那么就是修飾二維指針數(shù)組的常量指針, 跟const放在前后沒有必然聯(lián)系
void*轉(zhuǎn)char*用static_cast, char*轉(zhuǎn)float*用reinterpret_cast, 去掉const用const_cast
char* scratch1 = static_cast<char*>(workspace); // workspace首地址, 保存Q*K'的結(jié)果
char* scratch2 = scratch1 + bytesAligned; // TODO:Q*K'之后保存V的首地址
const float* input = static_cast<const float*>(inputs[0]);
float* output = static_cast<float*>(outputs[0]);
float* scr1 = reinterpret_cast<float*>(scratch1); // qkptr
float* scr2 = reinterpret_cast<float*>(scratch2); // pptr