質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Q&A

解決済

3回答

2190閲覧

C言語で書かれた相対時刻の計測のプログラムを実行する時のエラー

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

0グッド

0クリップ

投稿2019/07/20 12:08

編集2019/07/20 15:56

前提・実現したいこと

CPUクロックに基づく相対時刻の計測に掲載されている
「Linux OS/GNU CコンパイラでのRDTSC命令」のプログラムを実行しようとしています。

発生している問題・エラーメッセージ

コンパイル時に以下のエラーが出たのですが、どのように修正するべきか検討がつきません。

$ gcc -o measurement measurement.c measurement.c:7:5: warning: implicit declaration of function 'to_be_measured' is invalid in C99 [-Wimplicit-function-declaration] to_be_measured(); ^ measurement.c:9:30: warning: length modifier 'I64' results in undefined behavior or no effect with 'd' conversion specifier [-Wformat] printf("measured time : %I64d [clock]\n", stop - start); ~^~~~ 2 warnings generated. Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable "_rdtsc", referenced from: _measure_func in measurement-503114.o "_to_be_measured", referenced from: _measure_func in measurement-503114.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

該当のソースコード

rdtsc.h

c

1#ifndef RDTSC_H_ 2#define RDTSC_H_ 3 4inline unsigned long long rdtsc() { 5 unsigned long long ret; 6 __asm__ volatile ("rdtsc" : "=A" (ret)); 7 return ret; 8} 9 10#endif /* RDTSC_H_ */

measurement.c

c

1#include "rdtsc.h" 2#include <stdio.h> 3 4int measure_func() 5{ 6 unsigned long long start = rdtsc(); 7 to_be_measured(); 8 unsigned long long stop = rdtsc(); 9 printf("measured time : %I64d [clock]\n", stop - start); 10 11 return 0; 12}

補足情報(FW/ツールのバージョンなど)

ターミナル2.9.5

###ご回答を受けて修正したプログラムと実行結果
出力結果がよりわからなくなったのですが、どのように修正していくべきでしょうか。

measurement.c

c

1#include <stdio.h> 2#include "rdtsc.h" %<>にすると「 'rdtsc.h' file not found with <angled> include; use "quotes" instead」というerrorが表示されました 3 4int main(void){ 5 unsigned long long start = rdtsc(); 6 to_be_measured(); 7 unsigned long long stop = rdtsc(); 8 printf("measured time : %I64d [clock]\n", stop - start); 9 10 return 0; 11}

出力

$ gcc -o measurement measurement.c measurement.c:6:5: warning: implicit declaration of function 'to_be_measured' is invalid in C99 [-Wimplicit-function-declaration] to_be_measured(); ^ measurement.c:8:30: warning: length modifier 'I64' results in undefined behavior or no effect with 'd' conversion specifier [-Wformat] printf("measured time : %I64d [clock]\n", stop - start); ~^~~~ 2 warnings generated. Undefined symbols for architecture x86_64: "_rdtsc", referenced from: _main in measurement-7e629d.o "_to_be_measured", referenced from: _main in measurement-7e629d.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まずinline関数は使い方が難しいので、よく判らなければ指定しない方が無難です。
また、同様にヘッダーで関数定義するとトラブルの元なので、慣れないうちはソースファイル(.c)で定義した方がいいです。

すでに指摘されていますが、to_be_measured()が定義されていないので、エラーになっています。
何らかの処理にかかるクロック数を計測したいのですよね。計測したい関数の名前をto_be_measured()と置換えましょう。

ちょっとしたサンプルです

c

1#include <stdio.h> 2 3inline static unsigned long long rdtsc() { 4 unsigned long long ret; 5 __asm__ volatile ("rdtsc" : "=A" (ret)); 6 return ret; 7} 8 9//エラトステネスの篩で素数を求める 10void SieveOfEratosthenes(int num) 11{ 12 int sieve[num + 1]; 13 14 for (int i = 0; i <= num; i++) { 15 sieve[i] = 1; 16 } 17 18 for (int i = 2; i * i < num; i++) { 19 if (sieve[i] == 1) { 20 for (int j = i + i; j <= num; j += i) { 21 sieve[j] = 0; 22 } 23 } 24 } 25} 26 27int main(void) { 28 unsigned long long start = rdtsc(); 29 //to_be_measured(); 30 SieveOfEratosthenes(100000); //この関数の処理時間を計測 31 unsigned long long stop = rdtsc(); 32 printf("measured time : %llu [clock]\n", stop - start); 33 34 return 0; 35}

投稿2019/07/23 13:03

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

大変、失礼かもしませんが、 C言語のプログラムを作成された事がありますか?

C言語の場合、main()関数が必須で、その関数から、プログラムを開始します。

検索したら、ほぼ同じ内容の質問がありました。
C言語のエラーを修正したい

ここによると、あとは、#include の順番みたいです。

Warningは警告なので、その英文を読んでみましょう。
最初のは、宣言無しで使われている。次は、"d" の指定は意味無しという事でしょうか。

投稿2019/07/20 12:29

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/20 15:57

ご回答と類似質問の紹介をいただきましてありがとうございます。 「ご回答を受けて修正したプログラムと実行結果」を質問に追加いたしました。 可能であればどのように修正すべきかアドバイスをいただきたいです。
pepperleaf

2019/07/23 14:29

`<rdtsc.h>` の件は、"<>"で括ると、インクルードパスしか検索しないのが、Cコンパイラの仕様なので、"" とすることで、現在のディレクトリも見るようになります。 あとは、Bullさんからの回答で良いかと思います。 (gccが無いので、確認できない)
guest

0

"_main", referenced from:

main関数が存在しない、というエラーです
実行ファイルを作るには、main関数を必ず定義する必要があります

"_rdtsc", referenced from:

"_to_be_measured", referenced from:

それぞれ、使用している関数が見つからないというエラーです
あとの2つはワーニング(警告)なので、とりあえずはほっときましょう

投稿2019/07/20 12:20

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/20 15:57

ご回答いただきましてありがとうございます。 「ご回答を受けて修正したプログラムと実行結果」を質問に追加いたしました。 可能であればどのように修正すべきかアドバイスをいただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問