0

我们目前为 CUDA 使用模拟 JIT 编译器,其中在某些文件上调用 nvcc.exe 并生成生成的 .ptx 文件。

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 位于 C:/Program Files/..../ 这是一个 64 位目录,并且 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 回答