- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
调用 fork() 后出现“初始化错误”。如果我在没有 fork 的情况下运行相同的程序,一切正常。
if (fork() == 0) {
...
cudaMalloc(....);
...
}
#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;
}
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()
创建一个子进程。进程有自己的地址空间。 CUDA 上下文不能在两个不同的进程之间共享,原因有很多,其中之一是不同的地址空间中的各种指针毫无意义。
如果您在 fork()
之前创建了 CUDA 上下文,您不能在子进程中使用它。 cudaSetDevice(0);
call 尝试共享 CUDA 上下文,当您调用 cudaGetDeviceCount();
时,它在父进程中隐式创建。
正如您所暗示的,解决方案是在父进程或子进程中执行 CUDA 工作。如果您在多设备系统中,应该可以将单独的设备分配给单独的进程(CUDA simpleIPC sample code 正是这样做的)。 (关键是不要在 fork 之前创建 CUDA 上下文。)
您可能感兴趣 this question/answer和 this one .
这是一个完整的示例(需要 2 个 CUDA 设备),显示了使用单独 GPU 的子进程和父进程:
$ cat t345.cu
#include <unistd.h> /* Symbolic Constants */
#include <sys/types.h> /* Primitive System Data Types */
#include <errno.h> /* Errors */
#include <stdio.h> /* Input/Output */
#include <sys/wait.h> /* Wait for Process Termination */
#include <stdlib.h> /* General Utilities */
#define cudaCheckErrors(msg) \
do { \
cudaError_t __err = cudaGetLastError(); \
if (__err != cudaSuccess) { \
fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
msg, cudaGetErrorString(__err), \
__FILE__, __LINE__); \
fprintf(stderr, "*** FAILED - ABORTING\n"); \
exit(1); \
} \
} while (0)
__global__ void addkernel(int *data){
*data += 1;
}
int main()
{
pid_t childpid; /* variable to store the child's pid */
int retval; /* child process: user-provided return code */
int status; /* parent process: child's exit status */
/* only 1 int variable is needed because each process would have its
own instance of the variable
here, 2 int variables are used for clarity */
/* now create new process */
childpid = fork();
if (childpid >= 0) /* fork succeeded */
{
if (childpid == 0) /* fork() returns 0 to the child process */
{
printf("CHILD: I am the child process!\n");
printf("CHILD: Here's my PID: %d\n", getpid());
printf("CHILD: My parent's PID is: %d\n", getppid());
printf("CHILD: The value of my copy of childpid is: %d\n", childpid);
int *h_a, *d_a;
h_a = (int *)malloc(sizeof(int));
cudaSetDevice(0);
cudaCheckErrors("CHILD cudaSetDevice fail");
cudaMalloc(&d_a, sizeof(int));
cudaCheckErrors("cudaMalloc fail");
*h_a = 1;
cudaMemcpy(d_a, h_a, sizeof(int), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy H2D fail");
addkernel<<<1,1>>>(d_a);
cudaDeviceSynchronize();
cudaCheckErrors("kernel fail");
cudaMemcpy(h_a, d_a, sizeof(int), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy D2H fail");
printf("CHILD: result: %d\n", *h_a);
printf("CHILD: Sleeping for 1 second...\n");
sleep(1); /* sleep for 1 second */
cudaDeviceReset();
printf("CHILD: Enter an exit value (0 to 255): ");
scanf(" %d", &retval);
printf("CHILD: Goodbye!\n");
exit(retval); /* child exits with user-provided return code */
}
else /* fork() returns new pid to the parent process */
{
printf("PARENT: I am the parent process!\n");
printf("PARENT: Here's my PID: %d\n", getpid());
printf("PARENT: The value of my copy of childpid is %d\n", childpid);
printf("PARENT: I will now wait for my child to exit.\n");
int *h_a, *d_a;
h_a = (int *)malloc(sizeof(int));
cudaSetDevice(1);
cudaCheckErrors("PARENT cudaSetDevice fail");
cudaMalloc(&d_a, sizeof(int));
cudaCheckErrors("cudaMalloc fail");
*h_a = 2;
cudaMemcpy(d_a, h_a, sizeof(int), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy H2D fail");
addkernel<<<1,1>>>(d_a);
cudaDeviceSynchronize();
cudaCheckErrors("kernel fail");
cudaMemcpy(h_a, d_a, sizeof(int), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy D2H fail");
printf("PARENT: result: %d\n", *h_a);
wait(&status); /* wait for child to exit, and store its status */
printf("PARENT: Child's exit code is: %d\n", WEXITSTATUS(status));
cudaSetDevice(0);
cudaCheckErrors("PARENT cudaSetDevice 2 fail");
int *h_a2, *d_a2;
cudaMalloc(&d_a2, sizeof(int));
cudaCheckErrors("cudaMalloc fail");
h_a2 = (int *)malloc(sizeof(int));
*h_a2 = 5;
cudaMemcpy(d_a2, h_a2, sizeof(int), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy H2D fail");
addkernel<<<1,1>>>(d_a2);
cudaDeviceSynchronize();
cudaCheckErrors("kernel fail");
cudaMemcpy(h_a2, d_a2, sizeof(int), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy D2H fail");
printf("PARENT: result2: %d\n", *h_a2);
printf("PARENT: Goodbye!\n");
exit(0); /* parent exits */
}
}
else /* fork returns -1 on failure */
{
perror("fork"); /* display error message */
exit(0);
}
}
$ nvcc -arch=sm_20 -o t345 t345.cu
$ ./t345
CHILD: I am the child process!
CHILD: Here's my PID: 23603
CHILD: My parent's PID is: 23602
CHILD: The value of my copy of childpid is: 0
PARENT: I am the parent process!
PARENT: Here's my PID: 23602
PARENT: The value of my copy of childpid is 23603
PARENT: I will now wait for my child to exit.
CHILD: result: 2
CHILD: Sleeping for 1 second...
PARENT: result: 3
CHILD: Enter an exit value (0 to 255): 10
CHILD: Goodbye!
PARENT: Child's exit code is: 10
PARENT: result2: 6
PARENT: Goodbye!
$
关于fork后CUDA初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950047/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!