0

現在、一部のファイルで nvcc.exe が呼び出され、結果の .ptx ファイルが生成される CUDA 用のモック JIT コンパイラを使用しています。

bool executeWindowsProcess(ofstream &logFF) {

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    char cmd[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\"";
    char args[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\" --ptx --machine 32 -arch=sm_30 -o C:\\Users\\Yutong\\GOODKERNELCOMPILED.ptx --use_fast_math C:\\Users\\Yutong\\tempkernel.cu";

    logFF << cmd << endl;
    logFF << args << endl;

    CreateProcess(cmd, args, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi); 

    logFF << GetLastError() << endl;

    WaitForSingleObject(pi.hProcess, INFINITE);

    logFF << GetLastError() << endl;

    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    return true;
}

最初の GetLastError() は 123 を返します。これは、nvcc.exe がまったく呼び出されていないことを示しているようです。cmd[] を notepad.exe (C:/Windows/System32/notepad.exe にあります) のようなものに設定すると、問題なく動作します。何人かに聞いてみたところ、以下のようです。

  1. 私のアプリは 32​​ ビット Windows 用にデプロイされています
  2. nvcc.exe は、64 ビット ディレクトリである C:/Program Files/..../ にあり、CreateProcess は、アクセス許可のないディレクトリで実行可能ファイルを呼び出すことができないようです。

PS、以前は system() を使用して JIT コンパイラを呼び出していましたが、system() は外部ターミナル ウィンドウ (GUI を作成している) を起動するため、通常はお勧めしません。

4

1 に答える 1

2

GetLastError()実際のエラーが発生した場合にのみ意味があります。の戻り値をチェックしてCreateProcess()、実際にエラーが発生したことを確認してから呼び出しGetLastError()て取得していません。そうする必要があります、例えば:

bool executeWindowsProcess(ofstream &logFF)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    char cmd[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\"";
    char args[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\" --ptx --machine 32 -arch=sm_30 -o C:\\Users\\Yutong\\GOODKERNELCOMPILED.ptx --use_fast_math C:\\Users\\Yutong\\tempkernel.cu";

    logFF << cmd << endl;
    logFF << args << endl;

    if (!CreateProcess(cmd, args, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi))
    {
        logFF << GetLastError() << endl;
        return false;
    }

    logFF << "Running" << endl;

    WaitForSingleObject(pi.hProcess, INFINITE);

    logFF << "Terminated" << endl;

    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );

    return true;
}

そうは言っても、エラー 123 はERROR_INVALID_NAME(「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が正しくありません。」) です。コマンドラインを呼び出そうとしているので、のlpApplicationNameパラメーターCreateProcess()を NULL に設定し、lpCommandLineパラメーターを単独で使用することをお勧めします。

bool executeWindowsProcess(ofstream &logFF)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    char args[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\" --ptx --machine 32 -arch=sm_30 -o C:\\Users\\Yutong\\GOODKERNELCOMPILED.ptx --use_fast_math C:\\Users\\Yutong\\tempkernel.cu";

    logFF << args << endl;

    if (!CreateProcessA(NULL, args, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi))
    {
        logFF << GetLastError() << endl;
        return false;
    }

    logFF << "Running" << endl;

    WaitForSingleObject(pi.hProcess, INFINITE);

    logFF << "Terminated" << endl;

    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );

    return true;
}
于 2013-03-18T07:29:09.090 に答える