みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

制限時間が厳しいBOINCのタスクを全力で走らせる

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

制限時間が厳しいBOINCのタスクを全力で走らせる

投稿記事 by みけCAT » 9年前

自分はPrimeGridに参加しているのですが、一部のタスクは自分にとって制限時間が厳しいです。
ここでいう「制限時間が厳しい」タスクとは、
PCを立ち上げている時間全てで全力で走ってくれれば間に合いそうですが、
他のプロセスにCPU時間を取られてしまうと、期限までに計算が終わらなそうなタスクを示します。

こんな時は、このタスクに全力で走ってもらいましょう。
すなわち、1個のプロセッサにこのタスクのプロセスを割り当て、他のプロセスをできるだけ他のプロセッサのみに割り当てます。
これまではタスクマネージャを用いて手動で設定していましたが、明らかに単純作業で、人間の仕事では無さそうです。
そこで、自動で設定してくれるプログラムを組みました。

process_cpu_wariate.c

CODE:

#include 
#include 
#include 

#define PROCESS_MAX 102400

/* エラーメッセージを出力する */
void printLastError(const char* name) {
	char buffer[1024]={};
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),
		LANG_USER_DEFAULT,buffer,sizeof(buffer),NULL);
	printf("error in %s : %s\n",name,buffer);
}

/* OpenProcessできるようにする(?)特権を有効/無効化する */
void enableDebug(int enable) {
	HANDLE hToken;
	if(OpenProcessToken(GetCurrentProcess(),
	TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)==0) {
		printLastError("OpenProcessToken");
	} else {
		TOKEN_PRIVILEGES tp={};
		LUID luid;
		if(LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid)==0) {
			printLastError("LookupPrivilegeValue");
		} else {
			tp.PrivilegeCount=1;
			tp.Privileges[0].Luid=luid;
			tp.Privileges[0].Attributes=(enable?SE_PRIVILEGE_ENABLED:0);
			AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
		}
		CloseHandle(hToken);
	}
}

int main(int argc,char* argv[]) {
	static DWORD processes[PROCESS_MAX];
	DWORD process_size,process_num;
	unsigned int targetID_buffer;
	DWORD targetID;
	DWORD i;

	/* 対象のプロセスIDを取得 */
	if(argc!=2 || sscanf(argv[1],"%u",&targetID_buffer)!=1) {
		printf("Usage: %s \n",argv[0]);
		return 1;
	}
	targetID=(DWORD)targetID_buffer;

	/* 特権を有効化 */
	enableDebug(1);

	/* プロセスのリストを取得 */
	if(EnumProcesses(processes,sizeof(processes),&process_size)==0) {
		printLastError("EnumProcesses");
		return 1;
	}
	process_num=process_size/sizeof(DWORD);
	printf("number of process = %u\n",(unsigned int)process_num);

	for(i=0;igcc -O2 -s -static -o process_cpu_wariate process_cpu_wariate.c -lpsapi

YUKI.N>process_cpu_wariate 2320
number of process = 119
error in OpenProcess pid=0 : パラメータが間違っています。

error in OpenProcess pid=4 : アクセスが拒否されました。

error in OpenProcess pid=1440 : アクセスが拒否されました。

error in SetProcessAffinityMask pid=2340 : アクセスが拒否されました。

error in SetProcessAffinityMask pid=5332 : アクセスが拒否されました。


YUKI.N>
タスクマネージャで確認すると、全てのプロセスをチェックしたわけではないですが、
きちんと指定したプロセスIDのプロセスをCPU0、他のプロセスをCPU1に割り当ててくれたようです。
エラーが出ているプロセスは、タスクマネージャでも設定を拒否されるプロセスなので、仕方ないです。

仕上げに、タスクマネージャで優先度を「高」にしておくといいでしょう。
オフトピック
Q. 制限時間が厳しいタスクが2個以上並行で渡されたら?
A. 運が悪かったですね、諦めて1個以外を中止しましょう。
参考文献サイト

コメントはまだありません。