标题:软件对不同cpu(奔三、core2、不同指令集)的优化是编译器(比如gcc)的事情 ...
只看楼主
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
结帖率:93.75%
已结贴  问题点数:100 回复次数:15 
软件对不同cpu(奔三、core2、不同指令集)的优化是编译器(比如gcc)的事情还是程序代码比如(c代码)的事情?
不管是几核cpu,区别应该是指令集的不同(当然向下兼容)
我的看法是应该是 对于除了汇编语言外的编程对不同cpu指令集的优化 是编译器的事情

以上乱说的,各位可以拍砖了

[ 本帖最后由 zjsxwc 于 2011-7-27 10:07 编辑 ]
搜索更多相关主题的帖子: cpu 优化 编译器 
2011-07-26 20:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:20 
主要是軟件的事情

授人以渔,不授人以鱼。
2011-07-26 20:41
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
回复 2楼 TonyDeng
软件?怎么弄能举列吗?

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-07-26 20:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
針對CPU獨特性能寫代碼,無法簡單說怎麽弄。比如CPU是32位的或64位的,它們的整數範圍就不一樣,前者是兩個字節的,後者是四個字節的,要讓前者模仿前者,就只能在軟件中專門設計一種數據結構,將某种聲明為整數的數據類型作四字節處理,這是編譯器無法幫你的。何況,編譯器本身也是軟件,它所謂的各種編譯優化開關,就是針對硬件或操作系統而定的,這就是軟件的事情——不依賴於編譯器,也可以寫出有針對性的程序,就説明與編譯器無關。

有的人寫程序,能讓編譯器無法進一步優化,甚至比編譯器更優化,這些技術,如果有通用性,將可能被編譯器吸收,成爲編譯器提供的功能。我們要時刻記住:編譯器不過也是一個程序罷了,它能做的,我們也能做,所謂C是用C寫出來的,就是這個意思。

[ 本帖最后由 TonyDeng 于 2011-7-26 21:19 编辑 ]

授人以渔,不授人以鱼。
2011-07-26 21:04
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:20 
IA32

My life is brilliant
2011-07-26 21:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
再擧一例,好的程序,都力圖讓CPU不閑著,但如何令它不閑著卻是軟件的事。單核的CPU和雙核的CPU,方法就不相同:單核的,無論你設計如何巧妙,最終都是CPU按順序一條一條指令地執行,程序設計的優化,在於這些指令能夠更緊湊;對雙核,主要考慮點就不在這方面(其實也要考慮,但需要更多的考慮別的事情),因爲CPU此時真的可以同時做兩件事,那麽程序的安排就無需自己分配CPU時間片,直接以CPU同時做兩件事來考慮解決方案了,此時轉而需要更多地考慮事情的協同工作問題,不要讓兩件事互相等待,一個做完了要另一個做完才能繼續,這就不優化,安排什麽事情讓CPU去做,誰都幫不了你,編譯器不能、CPU自己也不能,操作系統(也是軟件)能幫一定的程度,但也不會聰明到知道你的程序到底要幹什麽,幹什麽、怎麽幹,是軟件的事。

授人以渔,不授人以鱼。
2011-07-26 21:18
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
回复 6楼 TonyDeng
能举列给个简单的“双核”C代码吗?我表示完全不懂
比如helloworld?

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-07-26 21:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你先把我前面說的東西看懂了再説什麽Helloworld要雙核代碼。是你程序要解決的問題需要什麽的問題,不是什麽程序都需要如何的事情。我的回答到此爲止。

授人以渔,不授人以鱼。
2011-07-26 22:01
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
不管是IA32还是IA64架构,大多数的编译器都会帮我们优化代码,比如:
程序代码:
int main(void) {
    int num;
   
    num += 2;

    num += 3;

    return 0;
}
编译器可能会帮我们优化为:
程序代码:
int main(void) {
    int num;
   
    num += 5;

    return 0;
}
毕竟这样达到了同样的效果,至于程序员为什么把 num += 5; 分为两次来写,编译器没必要知道。

当然好的程序员也要学会优化自己写的代码,比如:
程序代码:
#include <stdio.h>

typedef struct student {
    unsigned id;
    char name[9];
} STUDENT, * PSTUDENT;

// 在stdout中写入学生的id和name
void print_student_msg(STUDENT student) {
    printf("id : %u\n", student.id);
    printf("name : %s\n", student.name);
}
print_student_msg函数能很好的帮我们完成这个功能,但这是最好的做法吗?如果是我还会问吗:
程序代码:
#include <stdio.h>

typedef struct student {
    unsigned id;
    char name[9];
} STUDENT, * PSTUDENT;

// 在stdout中写入学生的id和name
void print_student_msg(const PSTUDENT cpstudent) {
    printf("id : %u\n", cpstudent->id);
    printf("name : %s\n", cpstudent->name);
}
这段代码和上面的代码有神马区别呢?仅仅是'.'句点变为了'->'和print_student_msg函数的参数类型变成了const PSTUDENT,就是const struct student *类型,因为不需要改变cpstudent字段的值,所以在前面加上了const。为什么这段代码比前一段代码更好呢:在IA32中指针都占4字节,而STUDENT,就是struct student类型却不止,unsigned占4字节,char[9]占9字节,说明STUDENT至少占13个字节,但实际上并不是13个字节,应该是16个字节。至于为什么STUDENT类型占16字节,不在本问题范围内就不解释了。这说明如果调用前一段代码的print_student_msg函数将会入栈16字节,而调用这段代码的print_student_msg函数只会入栈4字节(不止是这个函数,所有用指针作为参数的,在IA32中都只入栈4字节),调用前一段代码的print_student_msg函数似乎只浪费了12个字节的空间,也没什么,那如果调用这个函数一千次、一万次?或着你有一个更复杂的结构体,它有很多字段,那么就更不用说了。

当然我不明白为什么TonyDeng会说这跟CPU的内核个数有关,不管CPU如何调度,代码量就已经固定了,每条代码都应该得到执行。


My life is brilliant
2011-07-26 23:05
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:20 
去看《编译原理》

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-07-27 07:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-346149-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.244898 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved