- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试编译包含多行代数的代码。基本上,它是 2 个具有 12 个维度和可变模式大小的张量的强力收缩。但是,代码的性能目前不是问题,因为它甚至无法编译。代码本身嵌入到一个用 C99 编写的更大的框架中,它试图模仿 C++ 的行为,即它使用宏来替换模板和许多内联函数。基本上,这是无法编译的(我知道这并不优雅,但代码是使用 Mathematica 生成的,目的是使张量索引正确。稍后会对其进行优化):
void __attribute__((optimize("O0"))) MP(dineutron_uddu)(double complex* result, double complex* VVV_, double complex* vMv_, unsigned int L, int tis){
unsigned int lt=(unsigned int)nsites_dir[TUP];
double complex (*vMv)[L][4][lt][L][4]= (double complex (*)[L][4][lt][L][4]) vMv_;
double complex (*vvv)[L][nt][L]= (double complex (*)[L][nt][L]) VVV_;
unsigned int nnodes3=nnodes_dir[XUP]*nnodes_dir[YUP]*nnodes_dir[ZUP];
unsigned int mynode3=mynode_dir[XUP]+nnodes_dir[XUP]*(mynode_dir[YUP]+nnodes_dir[YUP]*mynode_dir[ZUP]);
{
unsigned int tf;
for(tf=0; tf<lt; tf++){
int tfs= lt*mynode_dir[TUP]+tf;
unsigned int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11;
COMPLEX sum=0.;
unsigned int run=0;
for(n0=0; n0<L; n0++){
for(n1=0; n1<L; n1++){
for(n2=0; n2<L; n2++){
for(n3=0; n3<L; n3++){
for(n4=0; n4<L; n4++){
for(n5=0; n5<L; n5++){
for(n6=0; n6<L; n6++){
for(n7=0; n7<L; n7++){
for(n8=0; n8<L; n8++){
for(n9=0; n9<L; n9++){
for(n10=0; n10<L; n10++){
for(n11=0; n11<L; n11++){
if(run%nnodes3==mynode3){
sum += vvv[n0][n4][tfs][n8] * vvv[n1][n5][tfs][n9] * ~(vvv[n2][n6][tis][n10]) * ~(vvv[n3][n7][tis][n11]) *
(
+ 0.25 * vMv[0][n2][0][tf][n9][1] * vMv[0][n3][0][tf][n5][1] * vMv[0][n11][0][tf][n4][1] * vMv[0][n7][1][tf][n8][0] * vMv[0][n10][1][tf][n1][0] * vMv[0][n6][1][tf][n0][0]
.....
接下来是大约 600 行代码,与之前的代码非常相似,但用于索引的不同组合。它不能在代数上进一步简化。....
然后循环结束,就是这样。
基本上,代码只包含复杂的加法和乘法,使用 C99 双复数数据类型。循环索引在编译时是未知的。我指定了属性 O0 以关闭优化以检查这是否会导致问题,但它仍然只是挂起。我的问题是:
1) 你们有人知道这里出了什么问题吗?2) 如果不是,我如何才能找到,即打印编译器正在处理的实际代码行,即获得编译器所做工作的某种实时输出。
非常感谢
最佳答案
能否将您的函数拆分成几个部分,并将每个迷你函数放入一个单独的文件(翻译单元)中?我想 GCC 在重新排列 basic blocks 时会花费很长时间
也许您可以使用 -fdump-
... optionis?
关于c - GCC 4.8.1 编译时在 C99 代码中有许多宏和内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566592/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!