ローカルで適当に作ったプログラム
test.c
#include <stdio.h>
#include "test.h"
void print_hoge(int num){
int i;
for(i = 0;i < num; i++){
printf("hoge\n");
}
}
test.h
#ifndef TEST_H
#define TEST_H
void print_hoge (int num);
#endif
test2.c
#include<stdio.h>
#include "test2.h"
void
print_hoge2 (int num)
{
int i;
for (i = 0; i < num; i++) {
print_hoge(num);
}
}
test2.h
#ifndef TEST_H
#define TEST_H
void print_hoge2 (int num);
#endif
main.c
#include "test.h"
int
main (void)
{
print_hoge2(5);
return 0;
}
スパコン上で改良したプログラム
test.c
#include <stdio.h>
#include "test.h"
void print_hoge(int num){
int i;
for(i = 0;i < num; i++){
printf("hoge\n");
}
}
test.h
#ifndef TEST_H
#define TEST_H
void print_hoge (int num);
#endif
test2.c
#include<stdio.h>
#include "test.h"
#include "test2.h"
void
print_hoge2 (int num)
{
int i;
for (i = 0; i < num; i++) {
print_hoge(num);
}
}
test2.h
#ifndef TEST_H
#define TEST_H
void print_hoge2 (int num);
#endif
main.c
#include "lib/test2.h"
int
main (void)
{
print_hoge2(5);
return 0;
}
考察
まずは変更点を列挙していく。
- main.cにおいて、#include "test.h" → #include"test2.h"
→main内で使う関数は"print_hoge2()"なのに、ローカルは"test.h"のインクルードのみで動いていることに…。
- test2.cにおいて、#include "test.h"を追加
→test2.c内では"print_hoge()"を使用しているのに、ローカルは"test.h"のインクルードなしで動いてた…。
こうしてみると、逆にローカルでは動いたことが驚き….
つまりは、スパコンにはその辺のライブラリを参照する部分での柔軟性がないことが伺える。
これにより、プログラムを組むときにはかなり厳密にプログラムを書く必要があるということだろうか。
問題
上記のこと以外の問題もある。
それは、ローカルで作ったライブラリがスパコン上では動かないものがあること。
全てを確認したわけではないので、動くものがあるかはわからないが動かないことは確認できた。
そのままのライブラリを使ってコンパイルを試みたところ
libtest.so: could not read symbols: File in wrong format
と表示され、コンパイルは通らず。
ググると、なにやらOSの32bitと64bitが関係ありそうだが詳しいことはわかっていない。
これの解決法は、ライブラリ自体をスパコン上でコンパイルしなおすこと。
上記に紹介したような簡単なライブラリならすぐにできるが、octaveのようなものをスパコン上でコンパイルするのはどうなのか….
そのまま使えるのが一番だが、最悪コンパイルしなおすことが必要?
引き続き検証していきまっしょい!
最終更新:2009年05月24日 15:31