调用fork()后出现“初始化错误”。如果在不使用fork的情况下运行同一程序,则一切正常。
在这种情况下,我只是试图从父进程中获取可用设备的数量。这个解决方法可以做到:
if (fork() == 0) {
...
cudaMalloc(....);
...
}
这是什么原因?
下面是一个完整的示例。如果我注释掉cudaGetDeviceCount调用,它就可以正常工作。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cuda_runtime.h>
#define PERR(call) \
if (call) {\
fprintf(stderr, "%s:%d Error [%s] on "#call"\n", __FILE__, __LINE__,\
cudaGetErrorString(cudaGetLastError()));\
exit(1);\
}
int
main(int argc, char **argv)
{
float *v_d;
int gpucount;
cudaGetDeviceCount(&gpucount);
if (fork() == 0) {
cudaSetDevice(0);
PERR(cudaMalloc(&v_d, 1000*sizeof(float)));
}
wait(NULL);
return 0;
}
简单的 Makefile:
PROGS = fork
CUDA_PATH = /usr/local/cuda
CXXFLAGS = -g -O0 -Wall
CXXINCLUDES = -I$(CUDA_PATH)/include
NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(CXX) -Xcompiler "$(CXXFLAGS)"
fork: fork.cxx
$(NVCC) $^ -o $@ $(LIBS)
clean:
(rm $(PROGS) *.o)
在这种情况下,我只是试图从父进程中获取可用设备的数量。这个解决方法可以做到:
if (fork() == 0) {
PERR(cudaGetDeviceCount(&gpucount));
return(gpucount);
}
wait(&gpucount);
gpucount = WEXITSTATUS(gpucount);
fork
和cudaMalloc
没有遇到任何问题。 - Robert Crovella