(57)【要約】【課題】逐次プログラムを並列プログラムに変換する際、ユーザが記述した並列化指示文と、処理系が自動生成した並列化指示文とを区別可能とする。【解決手段】並列化コンパイラ１１は、指示文生成部１６により、並列化解析部１３で行なった自動並列化解析の結果を、並列化指示文としてソースファイル１８に生成する際に、並列化指示文の文字列を一方向関数（「ハッシュ関数」）に通すことで求められる一意な文字列（「ハッシュ値」）をコメントとして付加し、ユーザが生成・変更・挿入した並列化指示文との判別を可能とする。【選択図】　　　　図１
2004029982.tif 000002
【特許請求の範囲】
【請求項１】
逐次的に処理を行なうよう記述された入力プログラムの並列性を解析し並列化指示文を生成して該入力プログラムに挿入する第１の手段を有し、該入力プログラムを、並列に処理を行なう並列処理プログラムに変換する並列化変換システムであって、
上記第１の手段で生成した並列化指示文からユニークな文字列を生成し、該並列化指示文と共に挿入する第２の手段と、
入力された上記並列処理プログラムにおける上記文字列と、該文字列が共に挿入された並列化指示文から上記第２の手段により生成される文字列とを照合し一致すれば、該並列化指示文が上記第１の手段により生成され、かつ、ユーザ変更されていないものであると判別する第３の手段と
を有することを特徴とする並列化変換システム。
【請求項２】
請求項１に記載の並列化変換システムであって、
上記第２の手段は、上記並列化指示文の文字列を一方向関数に通すことで上記文字列を生成し、該文字列を当該並列化指示文と同一の行にコメントとして挿入することを特徴とする並列化変換システム。
【請求項３】
請求項１、もしくは、請求項２のいずれかに記載の並列化変換システムであって、上記入力プログラムに上記並列化指示文と上記文字列を挿入したプログラムのソースファイルを記憶装置に格納する手段を有することを特徴とする並列化変換システム。
【請求項４】
コンピュータを、請求項１から請求項３のいずれかに記載の並列化変換システムにおける各手段として機能させるためのプログラム。
【請求項５】
逐次的に処理を行なうよう記述された入力プログラムの並列性を解析し並列化指示文を生成して該入力プログラムに挿入する第１の手順を有し、該入力プログラムを、並列に処理を行なう並列処理プログラムに変換するシステムの並列化変換方法であって、
上記第１の手順で生成した並列化指示文からユニークな文字列を生成し、該並列化指示文と共に挿入する第２の手順と、
入力された上記並列処理プログラムにおける上記文字列と、該文字列が共に挿入された並列化指示文から上記第２の手段により生成される文字列とを照合する第３の手順と、
該照合結果で両文字列が一致すれば、上記並列化指示文が上記第１の手順で生成され、かつ、ユーザ変更されていないものであると判別する第４の手順と、
上記並列処理プログラムから上記文字列と上記特定指示文を削除する第５の手順とを有し、
上記第５の手順で上記文字列と上記特定指示文を削除した上記並列処理プログラムに対して上記第１，第２の手順を実行して、該並列処理プログラムに対する再変換を行なうことを特徴とする並列化変換方法。
【請求項６】
請求項５に記載の並列化変換方法であって、
上記第２の手順では、上記並列化指示文の文字列を一方向関数に通すことで上記文字列を生成し、該文字列を当該並列化指示文と同一の行にコメントとして挿入することを特徴とする並列化変換方法。
【請求項７】
コンピュータに、逐次的に処理を行なうよう記述されたソースプログラムを、並列に処理を行なうオブジェクトプログラムに変換させるコンパイラであって、
上記コンピュータに、
上記ソースプログラムの並列性を解析し並列化指示文を生成して挿入する第１の手順と、
上記並列化指示文からユニークな文字列を生成し、該並列化指示文と共に挿入する第２の手順と、
上記並列化指示文と上記文字列を挿入した上記並列処理プログラムのソースファイルを記憶装置に格納する第３の手順と、
再変換のために入力した上記並列処理プログラムにおける文字列と、該文字列が共に挿入された並列化指示文から上記第２の手順により生成される文字列とが一致すれば、該並列化指示文が上記第１の手順により生成され、かつ、ユーザ変更されていない特定指示文であると判別する第４の手順と、
上記並列処理プログラムから上記文字列と上記特定指示文を削除する第５の手順と、
上記文字列と上記特定指示文を削除した上記並列処理プログラムに対する上記第１〜第３の手順を含めたコンパイル手順とを実行させることを特徴とするコンパイラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータプログラムの変換技術に係わり、特に、逐次的に処理を行なうように記述されたプログラムを、自動的あるいはプログラマの指示に従って、並列に処理を行なうプログラムに変換するコンピュータ処理技術に関するものである。
【０００２】
【従来の技術】
従来、並列処理を行なうプログラムを作成する技術として、プログラマが、逐次的に処理を行なうよう記述されたプログラムに対し、並列化を指示する指示文を挿入し、コンピュータが並列化コンパイラにより、その指示文を解析して並列処理を行なうプログラムに変換するものがある。
【０００３】
例えば、共有メモリ型並列計算機向けの並列化言語であるＯｐｅｎＭＰを規定した、”ＯｐｅｎＭＰ　Ｆｏｒｔｒａｎ　Ａｐｐｌｉｃａｔｉｏｎ　Ｐｒｏｇｒａｍ　Ｉｎｔｅｒｆａｃｅ　Ｖｅｒｓｉｏｎ　２．０，　Ｎｏｖｅｍｂｅｒ　２０００，　ｈｔｔｐ：／／ｗｗｗ．ｏｐｅｎｍｐ．ｏｒｇ／”では、プログラマがループ並列化や変数のプライベート化等の指示文をプログラム中に挿入し、コンパイラはその指示に従って並列化変換を行なう。
【０００４】
しかし、並列化指示を全てプログラマが行なうのは負担が大きい。これを解決する技術として、コンピュータにおいて、コンパイラ、あるいは並列化支援ツール等により、自動的に、プログラムの並列性を解析し、結果をプログラム中に並列化指示文として生成するものがある。
【０００５】
このようなコンピュータにより自動的に並列化指示文をプログラム中に生成する従来技術は、例えば、「Ｈａｏｑｉａｎｇ　Ｊｉｎ　，　Ｍｉｃｈａｅｌ　Ｆｒｕｍｋｉｎ　，　Ｊｅｒｒｙ　Ｙａｎ　”Ａｕｔｏｍａｔｉｃ　Ｇｅｎｅｒａｔｉｏｎ　ｏｆ　ＯｐｅｎＭＰ　Ｄｉｒｅｃｔｉｖｅｓ　ａｎｄ　Ｉｔｓ　Ａｐｐｌｉｃａｔｉｏｎ　ｔｏ　Ｃｏｍｐｕｔａｔｉｏｎａｌ　Ｆｌｕｉｄ　Ｄｙｎａｍｉｃｓ　Ｃｏｄｅｓ”，　Ｖｏｌｕｍｅ　１９４０，　Ｉｓｓｕｅ　，　ｐｐ　４４０−　Ｌｅｃｔｕｒｅ　Ｎｏｔｅｓ　ｉｎ　Ｃｏｍｐｕｔｅｒ　Ｓｃｉｅｎｃｅ」に記載されている。
【０００６】
このようにしてコンピュータで自動的に生成される並列化指示文は、プログラムのポータビリティを確保するために、例えばＯｐｅｎＭＰ指示文のような、汎用性のある指示文である必要がある。
【０００７】
しかし、従来技術においては、以下のような問題点がある。
【０００８】
すなわち、一度、処理系（コンピュータ）によって指示文が付加されたソースプログラムは、プログラマが修正をして再度処理系に入力する場合があり得る。この時、プログラマが実行文を修正することによって、処理系が過去に付加した指示文が正しくなくなる場合がある。処理系は、このような指示文を、プログラマが修正したプログラムに合うように、生成し直す必要がある。
【０００９】
一方で、同様の並列化指示文は、プログラマによって手動で付加される場合もある。処理系は、プログラマの指示に従わなければならないため、このような指示文は変更しないようにする必要がある。
【００１０】
ここで、ポータビリティを保つために、処理系が例えばＯｐｅｎＭＰ指示文のような汎用性のある指示文を付加する場合、プログラム中に記述されている指示文が、プログラマが記述したものなのか、処理系が以前に自動的に付加したものであるかの判別がつかないという問題が生じる。
【００１１】
このため、処理系は、処理系が過去に生成した指示文を修正することができない。あるいは、プログラマが付加した指示文も修正してしまう可能性がある。
【００１２】
【発明が解決しようとする課題】
解決しようとする問題点は、従来の技術では、並列処理を行なうプログラムにおける並列化を指示する指示文が、プログラマが記述したものなのか、処理系（コンピュータ）が以前に自動的に付加したものであるかを、処理系で判別することができない点である。
【００１３】
本発明の目的は、これら従来技術の課題を解決し、逐次的に処理を行なうよう記述されたソースプログラムの、並列に処理を行なうオブジェクトプログラムへの、コンピュータによる自動変換を効率化することを可能にすることである。
【００１４】
【課題を解決するための手段】
上記目的を達成するため、本発明では、並列化処理系（コンピュータ）が、逐次的に処理を行なうよう記述された入力プログラムを、並列に処理を行なうプログラムに変換する際、自動並列化解析の結果で得られた並列化指示文を、元のソースプログラム中に生成すると共に、当該並列化指示文の文字列を一方向関数に通すことで求められる一意な文字列をコメント文として、当該並列化指示文と同じ行に生成し、そのプログラムを再び入力して並列化する際に、並列化指示文の文字列を前記と同じ一方向関数に通すことで求められる一意な文字列と、当該プログラム上に記述された、前記並列化指示文の文字列を一方向関数に通すことで求められた一意な文字列との一致を調べることで、その指示文が処理系が自動的に挿入したものであり、かつユーザが変更していないことの検出を行なう。そして、処理系が挿入しかつユーザが変更していない指示文および文字列を並列処理プログラムから削除した後、この並列処理プログラムに対して、並列化指示文とその文字列の自動生成を含む再並列化処理を行なう。
【００１５】
【発明の実施の形態】
以下、本発明の実施の形態を、図面により詳細に説明する。
【００１６】
図１は、本発明に係わる並列化システムを設けたコンパイラを実行するコンピュータ装置の構成例を示すブロック図であり、図２は、図１のコンピュータ装置によるコンパイル動作時における本発明に係わる並列化処理動作例を示すフローチャート、図３は、図１におけるコンピュータ装置で生成された並列処理プログラムの構成例を示す説明図、図４は、図１における中間語生成部の処理動作例を示すフローチャート、図５は、図１における指示文生成部の処理動作例を示すフローチャートである。
【００１７】
図１におけるコンピュータ装置は、ＣＰＵ（Ｃｅｎｔｒａｌ　Ｐｒｏｃｅｓｓｉｎｇ　Ｕｎｉｔ）や主メモリ、表示装置、入力装置、外部記憶装置などからなり、例えば光ディスク駆動装置を介してＣＤ−ＲＯＭに記録されたプログラムやデータを外部記憶装置内にインストールした後、この外部記憶装置から主メモリに読み込みＣＰＵで処理することにより、本発明に係わる並列化システムとしての機能を具備した並列化コンパイラ１１としての各機能を実行する。
【００１８】
図１において、１０は逐次的に処理を行なうよう記述された入力プログラム（ソースファイル）（図中「入力ソース」と記載）、１１は並列化コンパイラ、１７は並列化コンパイラ１１により入力プログラム１０から生成されたコンピュータ実行可能なコード形態の並列処理用オブジェクトプログラム（（図中「目的コード」と記載）、１８は並列処理用オブジェクトプログラム１７のソースファイル（図中「出力ソース」と記載）である。
【００１９】
並列化コンパイラ１１は，中間語生成部１２、並列化解析部１３、並列化変換部１４、目的コード生成部１５、指示文生成部１６、および、これらの中間語生成部１２により生成され、並列化解析部１３、並列化変換部１４、目的コード生成部１５、指示文生成部１６により参照・更新される中間語１９と、各処理部１２〜１６でのコンパイル処理時に生成・参照される情報を格納する各種情報テーブル２０からなる。
【００２０】
中間語生成部１２は、入力プログラム１０を読み込み、字句解析、構文解析、意味解析等を行なって、中間語１９を生成する。中間語１９には、指示文による並列化指示の情報も含まれる。
【００２１】
並列化解析部１３は、中間語生成部１２で生成・登録された中間語１９および各種情報テーブル２０を参照して、プログラムの制御構造、データの参照関係を解析し、並列化可能なループの判定、及び並列化に必要な通信の決定を行ない、中間語１９および各種情報テーブル２０を更新する。
【００２２】
並列化変換部１４は、中間語１９および各種情報テーブル２０を参照して並列化解析部１３での並列化解析の結果を基に、プログラムの制御構造の変換及び通信文の生成等を行ない中間語１９および各種情報テーブル２０を更新する。
【００２３】
目的コード生成部１５は、中間語１９に対して最適化を行なった後、並列処理用オブジェクトプログラム１７を出力する。
【００２４】
そして、指示文生成部１６は、入力プログラム１０を読み込み、これに、並列化解析部１３で得られた並列化の情報を基に、並列化指示文を生成して挿入すると共に、この並列化指示文の文字列を一方向関数に通す等することでユニーク（唯一無比）な文字列を生成し、この文字列を並列化指示文と同一の行にコメントとして挿入し、ソースファイル１８として出力する。
【００２５】
このような構成により、コンピュータ装置は、並列化コンパイラ１１としての動作において、指示文生成部１６により本発明に係わる並列化処理動作を図２に示すようにして行なう。
【００２６】
すなわち、指示文生成部１６において、入力プログラム１０を読み込み（ステップ２０１）、並列化解析部１３で得られた並列化の情報を基に、並列化指示文を生成してこの入力プログラム１０に挿入すると共に（ステップ２０２）、この並列化指示文の文字列を一方向関数に通す等することでユニーク（唯一無比）な文字列を生成し、この文字列を並列化指示文と同一の行にコメントとして挿入し（ステップ２０３）、ソースファイル１８として出力する（ステップ２０４）。
【００２７】
このような手順で指示文生成部１６から出力されたソースファイル１８の例を図３に示す。
【００２８】
並列化コンパイラ１１は、図３に示すプログラムにおいて「ＤＯ　ｊループ」が並列化できることが分かるので、指示文生成部１６により、そのことを指示する「ＯｐｅｎＭＰ」のＰＡＲＡＬＬＥＬ　ＤＯ指示文３１（「！＄ＯＭＰ　ＰＡＲＡＬＬＥＬ　ＤＯ　ＰＲＩＶＡＴＥ　（Ｉ，Ｊ）」）を生成して挿入する。
【００２９】
さらに、指示文生成部１６は、挿入したＰＡＲＡＬＬＥＬ　ＤＯ指示文３１と同じ行に、並列化指示文の文字列を一方向関数に通すことで求められる一意な文字列３２　（ここではハッシュ値「０１２３４５６７８９ｆｅｄｃｂａ」）を、コメントの形式（「！ＨＡＳＨ０１２３４５６７８９ｆｅｄｃｂａ」）で挿入する。
【００３０】
このようにして、文字列３２を付与することにより、このソースファイル１８に対してコンパイルを行なう際には、指示文生成部１６において、前回並列化指示文を挿入したときと同じハッシュ関数で並列化指示文の字面からハッシュ値を計算し、例えば中間語生成部１２において、このハッシュ値と、ソースファイル１８上のハッシュ値とを比較・照合することで、並列化コンパイラ１１が自動的に生成した並列化指示文をユーザが変更したか否か自動的に検出して調べることができる。
【００３１】
尚、ハッシュ値を記述するコメントには適当なプリフィックスを付加して、ユーザが、ユーザ記述のコメントと混同したり、誤って消去したりすることのないようにする。図３に示す例では、コメント記号（「！」）の後ろに、コンパイラが挿入したハッシュ値であることをしめす「ＨＡＳＨ」という文字列を付加している。また、この時用いるハッシュ関数は、値域を十分大きくし、異なる字面に対して同一のハッシュ値が生成されることが実用上起きないようなものを選ぶ。
【００３２】
このようにすることにより、ユーザが出力ソースに対して再度指示文を挿入し直したいときに、並列化コンパイラ１１が自動生成した並列化指示文のみを更新し、ユーザが挿入した並列化指示文、ならびに、並列化コンパイラ１１が自動生成してユーザが変更した並列化指示文には手を加えずに保存することが可能となる。
【００３３】
次に、指示文生成部１６により並列化指示文と文字列とを生成して入力プログラムに挿入したソースファイル１８を再変換する際の本発明に係わる処理動作内容の内、上述した中間語生成部１２による、並列化指示文を読み込む処理について図４を用いて説明する。
【００３４】
図１の中間語生成部１２は、ステップ４０１の処理において並列化指示文を読み込んだ後、ステップ４０２の処理において、当該並列化指示文に対して指示文生成オプションが指定されているかどうかによって処理を分ける。
【００３５】
指示文生成オプションが指定されていなければ、全ての並列化指示文に従ってコンパイルを行なうようにするため、ステップ４０５の処理に移動して、従来技術と同様に、無条件に、並列化指示文情報として各種情報テーブル２０に登録する。
【００３６】
また、指示文生成オプションが指定されていれば、並列化コンパイラ１１自身が自動生成した並列化指示文は、再解析して挿入し直し、ユーザ（操作者、プログラマ）が指示した並列化指示文のみを読み込むために、ステップ４０３，３０４の処理を行なう。
【００３７】
すなわち、ステップ４０３において、並列化指示文の字面から求めたハッシュ値と、ソースファイル１８上にコメントとして埋め込まれたハッシュ値とを比較・照合し、一致しているか否かを調べる。尚、ハッシュ値がソースファイル１８上にコメントとして埋め込まれていない場合は、ハッシュ値が一致しないものとみなす。
【００３８】
ステップ４０４において、ハッシュ値が一致し、並列化コンパイラ１１自身により自動生成された並列化指示文であると分かった場合は、その指示文の情報はテーブルに登録せずに破棄し（ステップ４０６）、また、ハッシュ値が一致しない場合は、その指示文をユーザ指示とみなし、ステップ４０５における処理を実行し、並列化指示文の情報を各種情報テーブル２０に取り込む。
【００３９】
次に、図５を用いて、図１における指示文生成部１６の処理動作を説明する。
【００４０】
図１における指示文生成部１６は、まず、ステップ５０１における処理で、入力プログラム１０に指示文生成オプションが指定されているか否かを調べ、指定されていない場合は何もせずに終了する。
【００４１】
指示文生成オプションが指定されている場合、入力プログラム１０中の並列化指示文を全て消去する（ステップ５０２）。その後、ステップ５０３〜５０６における処理を繰り返し、図１の並列化解析部１３による並列化解析結果の情報（各種情報テーブル２０）を基に、入力プログラム１０に対する並列化指示文の生成と挿入を行なう。
【００４２】
すなわち、図４の処理により図１の中間語生成部１２が生成して各種情報テーブル２０に登録した並列化指示文が、並列化コンパイラ１１自身が自動生成した並列化指示文であるか否かを判定し（ステップ５０３）、並列化コンパイラ１１自身が自動生成した並列化指示文に対しては、当該並列化指示文の字面からハッシュ値を生成して当該並列化指示文と同一の行に付加して（ステップ５０４）、また、ユーザが入力した並列化指示文に対しては、当該並列化指示文のみを、入力プログラム１０に挿入し（ステップ５０５）、全ての並列化指示文に対して繰り返す（ステップ５０６）。
【００４３】
尚、並列化指示文が対象とする文または有効域に対して、既に並列化指示文が指定されている場合は、並列化指示文は挿入せず、既に存在している指示文を保存する。ユーザ指示は保存したままで指示文を再生成することが可能となる。
【００４４】
以上、図１〜図５を用いて説明したように、本例の並列化コンパイラ１１では、コンピュータ装置が、逐次的に処理を行なうよう記述された入力プログラムを、並列に処理を行なうプログラムに変換する際、自動並列化解析の結果で得られた並列化指示文を、元のソースプログラム中に生成すると共に、当該並列化指示文の文字列を一方向関数（ハッシュ関数）に通すことで求められる一意な文字列（ハッシュ値）をコメント文として、当該並列化指示文と同じ行に生成して挿入する。
【００４５】
このコメント文により、ユーザは、並列処理用に変換されたプログラムのソースファイルにおける、コンパイラが自動的に生成した並列化指示文を容易に特定することができる。
【００４６】
さらに、本例では、並列処理用に変換されたプログラムを再び入力して並列化する際に、並列化指示文の文字列を前記と同じ一方向関数に通すことで求められる一意な文字列と、当該プログラム上に記述された、前記並列化指示文の文字列を一方向関数に通すことで求められた一意な文字列との一致を調べることで、その指示文が処理系（コンピュータ）が自動的に挿入したものであり、かつユーザが変更していないことの検出を自動的に行なうことができる。
【００４７】
そして、処理系（コンピュータ）が挿入しかつユーザが変更していない指示文および文字列を並列処理プログラムから削除した後、この並列処理プログラムに対して、並列化指示文とその文字列の自動生成を含む再並列化処理を行なう。
【００４８】
このように、並列化コンパイラ１１自身が自動生成した並列化指示文の入ったソースプログラム（ソースファイル１８）を再びコンパイルする際に、プログラマが記述した並列化指示文と並列化コンパイラ１１自身が自動生成した並列化指示文とを区別し、並列化コンパイラ１１自身が自動生成した並列化指示文のみを消去し、再生成することにより、並列処理プログラムの再変換を効率的に行なうことができる。
【００４９】
尚、本発明は、図１〜図５を用いて説明した例に限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能である。例えば、本例では、本発明の並列化変換システムを並列化コンパイラ１１の一機能として説明したが、本発明は、逐次プログラムを入力し、並列化指示文の入ったソースを出力するツールとして実現しても良い。
【００５０】
また、本例では、共有メモリ型並列計算機向けの並列化指示仕様であるＯｐｅｎＭＰを指示文言語として用いていたが、本発明は、分散メモリ型計算機向けの並列化言語を用いて実施することも可能である。例えば、逐次プログラムを入力とし、分散メモリ型並列計算機向けの並列化解析を行ない、結果を分散メモリ型計算機向けの並列化言語であるＨＰＦの並列化指示文として、入力ソース中に挿入することができる。
【００５１】
また、本例では、指示文生成部１６で生成した文字列（ハッシュ値）を並列化指示文と同一の行にコメントとして挿入した並列処理プログラムを、ソースファイル１８として別ファイルで出力しているが、元の入力プログラム１０を置き換えることでも良い。
【００５２】
また、コンピュータ構成に関しても、キーボードや光ディスクの駆動装置の無いコンピュータ構成としても良い。また、本例では、光ディスクを記録媒体として用いているが、ＦＤ（Ｆｌｅｘｉｂｌｅ　Ｄｉｓｋ）等を記録媒体として用いることでも良い。また、プログラムのインストールに関しても、通信装置を介してネットワーク経由でプログラムをダウンロードしてインストールすることでも良い。
【００５３】
【発明の効果】
本発明によれば、並列処理を行なうプログラムにおける並列化を指示する指示文（並列化指示文）が、プログラマが記述したものなのか、処理系（コンピュータ）が以前に自動的に付加したものであるかを、処理系で自動的に判別することができ、逐次的に処理を行なうよう記述されたソースプログラムの、並列に処理を行なうオブジェクトプログラムへの、コンピュータによる自動変換を効率化することが可能である。
【図面の簡単な説明】
【図１】本発明に係わる並列化システムを設けたコンパイラを実行するコンピュータ装置の構成例を示すブロック図である。
【図２】図１のコンピュータ装置によるコンパイル動作時における本発明に係わる並列化処理動作例を示すフローチャートである。
【図３】図１におけるコンピュータ装置で生成された並列処理プログラムの構成例を示す説明図である。
【図４】図１における中間語生成部の処理動作例を示すフローチャートである。
【図５】図１における指示文生成部の処理動作例を示すフローチャートである。
【符号の説明】
１０：入力プログラム（「入力ソース」）、１１：並列化コンパイラ、１２：中間語生成部、１３：並列化解析部、１４：並列化変換部、１５：目的コード生成部、１６：指示文生成部、１７：オブジェクトプログラム（「目的コード」）、１８：ソースファイル（「出力ソース」）、１９：中間語、２０：各種情報テーブル、３１：ＰＡＲＡＬＬＥＬ　ＤＯ指示文、３２：文字列（「ハッシュ値」）。
【図１】
2004029982.tif 000003
【図２】
2004029982.tif 000004
【図３】
2004029982.tif 000005
【図４】
2004029982.tif 000006
【図５】
2004029982.tif 000007