В настоящее время мы используем фиктивный JIT-компилятор для CUDA, где 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) работает нормально. Я спросил некоторых людей, и кажется, что:
- Мое приложение развернуто для 32-разрядной версии Windows
- nvcc.exe находится в C:/Program Files/..../, который является 64-битным каталогом, и CreateProcess, похоже, не может вызывать исполняемые файлы в каталогах, для которых у него нет разрешения.
PS, раньше мы использовали system() для вызова JIT-компилятора, но system() запускает внешнее окно терминала (мы пишем графический интерфейс) и, как правило, не рекомендуется.
CreateProcess()
таким образом. Вам нужно будет либо 1) создать свой собственный дескриптор STDOUT черезCreatePipe()
и передать егоCreateProcess()
, затем вручную прочитать вывод nvcc и записать его в файл самостоятельно, либо 2) не иметьCreateProcess()
прямого вызова nvcc.exe, пусть он вызывает cmd .exe, передав ему параметр/C
, чтобы указать полную командную строку для его выполнения, включая конвейер. Используйте переменную среды%COMSPEC%
, чтобы найти полный путь к cmd.exe. 18.03.2013>
с cmd.exe. Я только что проверил его, он работал нормально. Я смог перенаправить вывод в файл .txt, используя"<full path to>\cmd.exe" /C <command line> > log.txt
. На самом деле именно потому, что он проходит через cmd.exe, перенаправление командной строки вообще можно использовать, потому что>
является частью командного процессора. 19.03.2013%COMSPEC%
. 19.03.2013lpApplicationName
, и все работало нормально. Он перестал работать с VS19. Установите его наNULL
и все хорошо! Спасибо. 09.07.2021