3
OpenMPループで実行可能ファイルを実行したい。 私は次のコードでそれを実行しようとしました:OpenMPループでexecvを呼び出す
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>
int main (int argc, char *argv[])
{
#pragma omp parallel
{
int thread_id = omp_get_thread_num();
char thread_name[4];
sprintf(thread_name, "%d", thread_id);
printf("%s\n", thread_name);
char* arg[] = {"task", thread_name, NULL};
execv("./task", arg);
}
}
対応する実行は、このようなgccで生成することができます:タスクのスクリプトは非常に単純なbashスクリプトである
gcc -fopenmp hello.c -o hello
:
#! /bin/sh
echo "Hello, I am process $1"
echo 'Please for me for 10 seconds...'
sleep 10
echo 'Thank you!'
私はこのようなプログラムを実行します:
./hello
"hello"実行可能スクリプトと "task"スクリプトの両方を含むディレクトリです。
3
2
0
1
Hello, I am process 3
Please for me for 10 seconds...
Thank you!
EXECV関数は、最初のスレッド(私の例では第三1)によって呼び出されたとき、EXECVへの他の呼び出しはスキップされているようです。
誰かが問題の原因を知っていますか?
ありがとうございます!
EDIT:システム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <omp.h>
int main (int argc, char *argv[])
{
#pragma omp parallel
{
int thread_id = omp_get_thread_num();
char thread_name[4];
sprintf(thread_name, "%d", thread_id);
char command[50];
strcat(command, "./task ");
strcat(command, thread_name);
system(command);
}
}
また、「現在のプロセスを置き換える」とは、 'execv()'(または他の 'execve()'ラッパー関数を呼び出す以外のスレッドをすべて破壊することです)。この場合、 'system()'の使用を推奨する傾向があります。なぜなら、フロントエンドでもう少しセットアップが必要になるからです。 –
こんにちは!ご回答どうもありがとうございました。私はそれが動作するはずだと思うが、別の問題があります:スクリプト "タスク"は2つの最初のスレッドでのみ実行されるようです。最後の2つは、次のエラーが表示されます。そのようなファイルやディレクトリはありません。なぜなのかご存知ですか? – Aleph
@Aleph: 'strace'コマンドはあなたの友人になります。 'strace -f -ff -o hellotrace hello'を実行します。各スレッドとプロセスのトレースファイルが生成されます。次に、生成されたトレースファイルを読み取ります。 –