Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >映射内存:设备->主机写入在主机上不可见

映射内存:设备->主机写入在主机上不可见
EN

Stack Overflow用户
提问于 2015-10-31 10:58:21
回答 1查看 371关注 0票数 0

我想要做的是修改一个驻留在映射内存中的变量,该变量将导致主程序退出。

但是,主程序没有这样做,而是继续在while (var == 0) ;线上旋转。我不知道新的值是如何被冲掉的,这样它在主机端也是可见的。

顺便说一句。变量在任何地方都声明为volatile,我尝试使用__threadfence_system()函数,但没有成功。

主机->设备方向工作良好。

系统: Windows 7 x64驱动程序358.50 GTX 560

下面是我无法工作的代码:

代码语言:javascript
运行
AI代码解释
复制
static void handleCUDAError(cudaError_t err, const char *file, int line)
{
    if (err != cudaSuccess) {
        printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
        exit(EXIT_FAILURE);
    }
}

#define CUDA_ERROR_CHECK(err) (handleCUDAError(err, __FILE__, __LINE__ ))

__global__ void echoKernel(volatile int* semaphore)
{
    *semaphore = 1;

    __threadfence_system();
}

int main()
{
    CUDA_ERROR_CHECK(cudaSetDevice(0));
    CUDA_ERROR_CHECK(cudaSetDeviceFlags(cudaDeviceMapHost));

    volatile int var = 0;
    volatile int *devptr;

    CUDA_ERROR_CHECK(cudaHostRegister((int*)&var, sizeof (int), cudaHostRegisterMapped));
    CUDA_ERROR_CHECK(cudaHostGetDevicePointer(&devptr, (int*)&var, 0));

    echoKernel <<< 1, 1 >>> (devptr);

    while (var == 0) ;

    CUDA_ERROR_CHECK(cudaDeviceSynchronize());

    CUDA_ERROR_CHECK(cudaHostUnregister((int*)&var));
    CUDA_ERROR_CHECK(cudaDeviceReset());

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-31 15:36:26

当我在linux上运行您的代码时,它的运行是没有问题的。

但是,在windows上,WDDM命令批处理存在问题。实际上,在进入挂起的while循环之前,内核不会启动,也不会启动。

WDDM命令队列是一个命令队列,最终将进入GPU设备。各种事件将导致这个队列被“刷新”,并将内容作为一批命令传递到GPU。

各种cuda运行时API调用可以有效地强制命令队列的“刷新”,例如cudaDeviceSynchronize()cudaMemcpy()。但是,在内核启动后,在进入while-循环之前,您不会发出任何运行时API调用。因此,在这个场景中,内核调用似乎被“卡在”队列中,而从未被“刷新”。

您可以通过多种方式来解决这个问题,例如,在内核启动后记录一个事件,然后查询该事件的状态。这将产生刷新队列的效果,队列将启动内核。

下面是对您的代码的一个示例修改,它适用于我:

代码语言:javascript
运行
AI代码解释
复制
#include <stdio.h>
static void handleCUDAError(cudaError_t err, const char *file, int line)
{
    if (err != cudaSuccess) {
        printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
        exit(EXIT_FAILURE);
    }
}

#define CUDA_ERROR_CHECK(err) (handleCUDAError(err, __FILE__, __LINE__ ))

__global__ void echoKernel(volatile int* semaphore)
{
    *semaphore = 1;

    __threadfence_system();
}

int main()
{
    CUDA_ERROR_CHECK(cudaSetDevice(0));
    CUDA_ERROR_CHECK(cudaSetDeviceFlags(cudaDeviceMapHost));

    volatile int var = 0;
    volatile int *devptr;

    CUDA_ERROR_CHECK(cudaHostRegister((int*)&var, sizeof(int), cudaHostRegisterMapped));
    CUDA_ERROR_CHECK(cudaHostGetDevicePointer(&devptr, (int*)&var, 0));

    cudaEvent_t my_event;
    CUDA_ERROR_CHECK(cudaEventCreate(&my_event));

    echoKernel << < 1, 1 >> > (devptr);
    CUDA_ERROR_CHECK(cudaEventRecord(my_event));
    cudaEventQuery(my_event);

    while (var == 0);

    CUDA_ERROR_CHECK(cudaDeviceSynchronize());

    CUDA_ERROR_CHECK(cudaHostUnregister((int*)&var));
    CUDA_ERROR_CHECK(cudaDeviceReset());

    return 0;
}

在CUDA 7.5上测试,驱动程序358.50,Win7 x64发布项目,GTX460M。

请注意,我们没有将cudaEventQuery调用包装在标准错误检查器中,因为它的预期行为是在事件尚未完成时返回非零状态。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33455396

复制
相关文章
kubernetes | pod
基于centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0
Amadeus
2022/10/25
6070
Kubernetes Pod基础
Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或者多个container组成的。
kubernetes中文社区
2019/06/24
7450
Kubernetes Pod详解
Pod中通过共享Network Namespace的方式进行网络的共享,但是如果是以下方式进行Network Namespace共享会有问题:
shysh95
2022/05/24
7970
Kubernetes Pod详解
【Kubernetes系列】Pod
Pod是一组(一个或多个) 容器 ; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
Java技术债务
2022/10/28
6060
Kubernetes Pod Evicted[通俗易懂]
近日 Kubernetes 测试集群 Pod 状态出现 Evicted 现象 , 但是项目还是能正常提供服务 , 最先的解决办法是手动将 Evicted 状态的 Pod 删除。
全栈程序员站长
2022/08/30
1.1K0
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
之前在 Kubernetes 集群中部署了高可用 Harbor 镜像仓库,并使用 Ceph RBD 提供持久化存储。本来是挺美滋滋的,谁料昨天有一台节点 NotReady 了,导致 Harbor 的某个组件所在的 Pod 被重新调度了,但是重新调度后的 Pod 并没有启动成功。
米开朗基杨
2021/01/14
2.9K0
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
git将本地代码上传仓库(gitlab克隆代码到本地)
这样,把文件添加到git本地管理目录中,这类似Svn的add操作,实际上,还没有提交到本地管理仓库。利用
全栈程序员站长
2022/08/02
1.6K0
【iOS】将代码上传到pod创库
可以看到我们指定source_files指定在PPKit/Classes文件夹下的所有文件,所以我们的源码都放在这里就可以了
MapleYe
2020/03/30
8200
【iOS】将代码上传到pod创库
ELK学习笔记之filbeat pod无法将容器日志发送
题目:ELK学习笔记之filbeat pod无法将容器日志发送到Elasticsearch7.8 reconnect to backoff with 9 reconnect attempt(s)
Jetpropelledsnake21
2020/08/02
6240
使用 iptables 将 Kubernetes Service 流量随机发送到 Pod
本文将带大家了解 Kubernetes 的 kube-proxy 组件如何使用 iptables 将 service 流量随机发送到 Pod,目的是实现 service 所需的 iptables 规则。
CNCF
2021/04/21
1.7K0
Kubernetes 1.19.0——Pod(1)
kubectl run 名字 -image=镜像 --labels=”aa=bb,aa2=bb2...” --env=”k1=v1” --port=80 --image-pull-policy=策略
gz_naldo
2020/09/18
6960
Kubernetes 1.19.0——Pod(1)
Kubernetes 1.19.0——Pod(2)
所谓静态pod就是,不是master上创建的,而是需要到Node的/etc/kubelet.d/里创建一
gz_naldo
2020/09/19
7322
Kubernetes 1.19.0——Pod(2)
2.1 Kubernetes--Pod
  自主式Pod是不被控制器管理的Pod. 这种Pod死亡以后, 不会被重新启动. 这个Pod死了以后, 副本数就达不到期望值了, 也不会有人去创建一个新的Pod为达到副本数的期望值.
用户7798898
2020/09/27
7850
2.1 Kubernetes--Pod
kubernetes中的pod
在Kubernetes中,Pod是最小的可部署单元。Pod是一个逻辑主机,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址和一组共享的存储和网络资源。Kubernetes使用Pod来调度和管理应用程序的运行。
玖叁叁
2023/04/28
5880
Kubernetes 系列(3) —— Pod
Pod 是 Kubernetes 的基本操作单元,也是应用运行的载体,包含一个或多个密切相关的容器。整个 Kubernetes 系统都是围绕着 Pod 展开的,比如如何运行 Pod、如何保证 Pod 的数量,如何访问 Pod 等。
求和小熊猫
2021/09/10
9820
Kubernetes Pod 驱逐详解
在 Kubernetes 中,Pod 使用的资源最重要的是 CPU、内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO)。可压缩资源不可能导致 Pod 被驱逐,因为当 Pod 的 CPU 使用量很多时,系统可以通过重新分配权重来限制 Pod 的 CPU 使用。而对于不可压缩资源来说,如果资源不足,也就无法继续申请资源(内存用完就是用完了),此时 Kubernetes 会从该节点上驱逐一定数量的 Pod,以保证该节点上有充足的资源。
米开朗基杨
2019/08/29
3.3K0
Kubernetes Pod 驱逐详解
Kubernetes Pod 全面知识
Pod 是在 Kubernetes 中创建和管理的、最小的可部署的计算单元,是最重要的对象之一。一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络、存储等环境。
痴者工良
2021/11/30
8570
Kubernetes Pod 全面知识
Kubernetes Pod入门指南
Pod是Kubernetes项目里定义的最小可调度单元,是Kubernetes对应用程序的抽象。在这篇文章里我将会介绍Kubernetes里Pod的基本概念,使用方式,生命周期以及如何使用Pod部署应用。读这篇文章的朋友我会默认你已经了解Kubernete是用来解决什么问题的,以及电脑上已经安装了Minikube这个能试验Kubernetes功能的工具。如果尚未做好这些准备工作,推荐先去看下面的两篇文章做好准备工作后再来学习这里的内容。
KevinYan
2020/08/10
4840
Kubernetes通过端口转发映射本地端口到指定的Pod应用端口
使用资源类型/名称,如deployment/mydeployment来选择pod。如果省略,资源类型默认为'pod'。
院长技术
2021/01/06
3.2K0
Kubernetes Pod OOM 排查日记
在一次系统上线后,我们发现某几个节点在长时间运行后会出现内存持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐OOM;如果调度到同样问题的节点上,也会出现Pod一直起不来的问题。我们尝试了杀死Pod后手动调度的办法(label),当然也可以排除调度节点。但是在一段时间后还会复现,我们通过监控系统也排查了这段时间的流量情况,但应该和内存持续占用没有关联,这时我们意识到这可能是程序的问题。
yoyofx
2020/08/10
2.7K0

相似问题

如何修改DOCKERFILE,将wget安装到kubernetes pod中?

21

将本地目录挂载到kubernetes pod

20

将本地目录托管给Kubernetes Pod

10

如何将配置文件安装到Kubernetes Pod中?

15

kubernetes将本地文件添加到pod

4185
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文