摘要
我对 Open64 很感兴趣,本文是这几天我学习 Open64 的一点粗浅认识,目前
我也不是很熟悉 Open64 ,望各位多多指教。
目录
目录 1
1 使用 Open64 2
1.1 获取代码和文档 . . . . . . . . . . . . . . . . . . . . . 2
1.2 本机构建 . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Open64 简介 5
2.1 代码布局 . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Whirl 结构 . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Very High WHIRL . . . . . . . . . . . . . . . . . 9
2.2.2 High WHIRL . . . . . . . . . . . . . . . . . . . 9
2.2.3 Mid WHIRL . . . . . . . . . . . . . . . . . . . . 9
2.2.4 Low WHIRL . . . . . . . . . . . . . . . . . . . . 10
2.2.5 Very Low WHIRL . . . . . . . . . . . . . . . . . 10
3 x64 平台支持 11
3.1 Makefile . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1.1 交叉编译规则 . . . . . . . . . . . . . . . . . . 11
3.1.2 编译规则 . . . . . . . . . . . . . . . . . . . . 12
3.2 构建目录 . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Target 描述代码 . . . . . . . . . . . . . . . . . . . . 15
3.4 C/C++ 前端支持 . . . . . . . . . . . . . . . . . . . . . 16
3.5 后端支持 . . . . . . . . . . . . . . . . . . . . . . . . 18
3.6 CG 支持 . . . . . . . . . . . . . . . . . . . . . . . . 20
3.7 平台配置文件 . . . . . . . . . . . . . . . . . . . . . . 21
3.8 ISA . . . . . . . . . . . . . . . . . . . . . . . . . . 25
参考文献 34
1
第 1 章
使用 Open64
1.1 获取代码和文档
我们肯定是要用到代码的,不仅仅是从代码构建,还要看代码呢,有了能力
你能禁的住修改算法的诱惑么?去 Open64 主页 http://www.open64.net/ 下
载最新的源代码,或者呢,运行下面命令
svn export https://svn.open64.net/svnroot/open64/trunk open64
Open64 的设计是非常吸引人的。Pro64 那个幻灯片和ORC的两个 sides
非常 详细, 我也 在学 习中。 你可 以在 http://sourceforge.net/project/
showfiles.php?group_id=34861&package_id=27296&release_id=125200 找
到那些开放的文档,我觉得都是很好的。
1.2 本机构建
我说的本机构建可是我的 KUbuntu 8.10 AMD64 ,在 i386 或者其他 GNU/
Linux 发行版本上自己摸索吧。
值得注意的是编译 Open64 最好使用 GCC 3.x ,而 GCC 4.1 和 GCC 4.2
经我测试是可以的,但是目前最新的 GCC 4.3.x 是不可以的。为什么呢? GCC
4.3 默认不再包含很多非标准的头文件和库,以及语法的进一步标准化,这当
然是一件好事情,但是目前最新的 Open64-4.2.1 恰恰还在使用那些“旧”特
性。
使用 GCC 4.3.2 编译 Open64 会在编译 si.o 的时候出错,我现在对 Open64
的代码还不熟,就没有深究,如果你知道原因,请告诉我,谢谢。
此外,在 Ubuntu 上,你还要确保自己的机器上安装了 csh 和 mawk 。
最后,系统自带的 GNU make 3.81 是可以工作的,如果出现错误只要再重
复几次就可以了,推荐的 3.80 我在源里没有找到,既然不碍事就没用了 3.81
。
那么我是怎么在 KUbuntu 上使用低版本 GCC 的呢?只要源里有的,装上。
或者你自己编译安装。不使用 Ubuntu 那个特别的方法,就使用最简单有效,
2
适用度广的 ln -s 一下就 OK 了。其实 Ubuntu 自己 gcc 和 g++ 也是 ln
-s 的。不用奇怪,一个机器上有多种编译器,每种编译器还有多个版本这很正
常。
在 Ubuntu 这个比较新潮的 GNU/Linux 发行版上构建 Open64 需要把
Makefile.gbase 里面的 'test -a' 改成 'test -e' ,运行下面命令找到所有
包含 'test -a' 的文件,当然你可以写个脚本完成替换动作,但是要注意不要
替换掉不是 Makefile 的文件。
grep -r 'test -a' *
然后就修改吧
make 的时候要在 sh 上做手脚,因为 Ubuntu 默认的 shell 是dash
make SHELL=/bin/bash all
make SHELL=/bin/bash library
然后设置环境变量
export TOOLROOT=/opt/open64-4.2.1
export PATH=$PATH:$TOOLROOT/bin
可以安装了
make SHELL=/bin/bash install
最后再把下面内容写入你的 .bashrc
export TOOLROOT=/opt/open64-4.2.1
export PATH=$PATH:$TOOLROOT/bin
简单测试一下下吧,下面内容写入 a.cc
#include <iostream>
//#include <omp.h>
int main()
{
// std::cout << omp_get_max_threads() << std::endl;
const int N = 1 << 12;
const int M = 1 << 22;
int *a = new int [N];
#pragma omp parallel for
for (int i = 0; i < N; ++i)
a[i] = 0;
#pragma omp parallel for
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j)
a[i] += j % N + 3;
3