首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CUDA钉住从设备中释放的内存

CUDA钉住从设备中释放的内存
EN

Stack Overflow用户
提问于 2013-05-07 02:59:40
回答 3查看 1.9K关注 0票数 2

CUDA 5,设备功能3.5,VS 2012,64位Win 2012 Server。

线程之间没有共享内存访问,每个线程都是独立的。

我用的是带零拷贝的固定内存。只有当我在主机上发出cudaDeviceSynchronize时,我才能从主机读取设备所写的固定内存。

我希望能够:

  1. 设备更新后,立即刷新固定内存。
  2. 不阻塞设备线程(可能通过异步复制)

每次写完设备后,我都试着打电话给__threadfence_system__threadfence,但是没有冲洗。

下面是一个完整的示例数据自动化系统代码,演示了我的问题:

代码语言:javascript
运行
AI代码解释
复制
#include <conio.h>
#include <cstdio>
#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

__global__ void Kernel(volatile float* hResult) 
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;

    printf("Kernel %u: Before Writing in Kernel\n", tid);
    hResult[tid] = tid + 1;
    __threadfence_system();
    // expecting that the data is getting flushed to host here!
    printf("Kernel %u: After Writing in Kernel\n", tid);
    // time waster for-loop (sleep)
    for (int timeWater = 0; timeWater  < 100000000; timeWater++);
}

void main()
{
    size_t blocks = 2;
    volatile float* hResult;
    cudaHostAlloc((void**)&hResult,blocks*sizeof(float),cudaHostAllocMapped);
    Kernel<<<1,blocks>>>(hResult);
    int filledElementsCounter = 0;
    // naiive thread implementation that can be impelemted using 
    // another host thread
    while (filledElementsCounter < blocks) 
    {
        // blocks until the value changes, this moves sequentially 
        // while threads have no order (fine for this sample).
        while(hResult[filledElementsCounter] == 0);
        printf("%f\n", hResult[filledElementsCounter]);;
        filledElementsCounter++;
    }
    cudaFreeHost((void *)hResult);
    system("pause");
}

目前,此示例将无限期地等待,因为除非我发出cudaDeviceSynchronize,否则不会从设备中读取任何内容。下面的示例可以工作,但它是而不是,因为它违背了异步复制的目的:

代码语言:javascript
运行
AI代码解释
复制
void main()
{
    size_t blocks = 2;
    volatile float* hResult;
    cudaHostAlloc((void**)&hResult, blocks*sizeof(float), cudaHostAllocMapped);
    Kernel<<<1,blocks>>>(hResult);
    cudaError_t error = cudaDeviceSynchronize();
    if (error != cudaSuccess) { throw; }
    for(int i = 0; i < blocks; i++) 
    {
        printf("%f\n", hResult[i]);
    }
    cudaFreeHost((void *)hResult);
    system("pause");
}
EN

回答 3

Stack Overflow用户

发布于 2013-10-15 04:27:10

我在CentOS6.2上使用CUDA 5.5和Tesla M2090播放了您的代码,最后可以得出这样的结论:

它不能在您的系统上工作的问题必须是驱动程序问题,我建议您获得TCC驱动程序。

我附加了我的代码,运行良好,做你想做的事。这些值在内核结束之前出现在主机端。如您所见,我添加了一些计算代码,以防止由于编译器优化而删除for循环。我添加了一个流和一个回调,在流中的所有工作完成后执行。该程序输出1 2,在很长一段时间内,在stream finished...被打印到控制台之前什么也不做。

代码语言:javascript
运行
AI代码解释
复制
 #include <iostream>
 #include "cuda.h"
 #include "cuda_runtime.h"
 #include "device_launch_parameters.h"

 #define SEC_CUDA_CALL(val)           checkCall  ( (val), #val, __FILE__, __LINE__ )

 bool checkCall(cudaError_t result, char const* const func,  const char *const file, int const line)
 {
    if (result != cudaSuccess)
    {
            std::cout << "CUDA (runtime api) error: " << func << " failed! " << cudaGetErrorString(result) << " (" << result << ") " << file << ":" << line << std::endl;
    }
    return result != cudaSuccess;
}

class Callback
{
public:
    static void CUDART_CB dispatch(cudaStream_t stream, cudaError_t status, void *userData);

private:
    void call();
};

void CUDART_CB Callback::dispatch(cudaStream_t stream, cudaError_t status, void *userData)
{
    Callback* cb = (Callback*) userData;
    cb->call();
}

void Callback::call()
{
     std::cout << "stream finished..." << std::endl;
}



__global__ void Kernel(volatile float* hResult)
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;

    hResult[tid] = tid + 1;
    __threadfence_system();
    float A = 0;
    for (int timeWater = 0; timeWater  < 100000000; timeWater++)
    {
        A = sin(cos(log(hResult[0] * hResult[1]))) + A;
        A = sqrt(A);
    }
}

int main(int argc, char* argv[])
{
    size_t blocks = 2;
    volatile float* hResult;
    SEC_CUDA_CALL(cudaHostAlloc((void**)&hResult,blocks*sizeof(float),cudaHostAllocMapped));

    cudaStream_t stream;
    SEC_CUDA_CALL(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking));
    Callback obj;
    Kernel<<<1,blocks,NULL,stream>>>(hResult);
    SEC_CUDA_CALL(cudaStreamAddCallback(stream, Callback::dispatch, &obj, 0));

    int filledElementsCounter = 0;

    while (filledElementsCounter < blocks)
    {
        while(hResult[filledElementsCounter] == 0);
        std::cout << hResult[filledElementsCounter] << std::endl;
        filledElementsCounter++;
    }

    SEC_CUDA_CALL(cudaStreamDestroy(stream));
    SEC_CUDA_CALL(cudaFreeHost((void *)hResult));
}

没有电话返回一个错误和库达-模检查没有发现任何问题。这是按计划进行的。你真该试试TCC的驱动程序。

票数 4
EN

Stack Overflow用户

发布于 2013-05-07 03:16:04

不能将主机指针直接传递给内核。如果使用带有cudaHostAlloc标志的cudaHostAllocMapped分配主机内存,那么首先必须检索映射主机内存的设备指针,然后才能在内核中使用它。使用cudaHostGetDevicePointer获取映射主机内存的设备指针。

代码语言:javascript
运行
AI代码解释
复制
float* hResult, *dResult;
cudaHostAlloc((void**)&hResult, blocks*sizeof(float), cudaHostAllocMapped);
cudaHostGetDevicePointer(&dResult,hResult);
Kernel<<<1,blocks>>>(dResult);
票数 2
EN

Stack Overflow用户

发布于 2013-05-07 03:58:35

在继续之前,调用__threadfence_system()将确保系统对写入是可见的,但是您的CPU将缓存h_result变量,因此您只是在无限循环中旋转旧值。尝试将h_result标记为volatile

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

https://stackoverflow.com/questions/16417346

复制
相关文章
Ubuntu 14.04 Server 如何安装 Webmin
webmin 是一款通过 WEB 方式远程管理主机的工具软件,通过 webmin 可以通过图形界面远程对主机进行设置,webmin 包括了很多插件,通过安装插件实现对主机更多功能的管理。
星哥玩云
2022/07/01
1.4K0
Ubuntu 14.04 Server 如何安装 Webmin
如何在Ubuntu 18.04上安装Webmin
Webmin是适用于任何Linux机器的基于Web的控制面板,可让您通过基于Web的现代界面管理服务器。使用Webmin,您可以动态更改常用软件包的设置,包括Web服务器和数据库,以及管理用户,组和软件包。
好烟
2018/08/01
2.1K0
如何在Ubuntu 18.04上安装Webmin
如何在Ubuntu 16.04上安装Webmin控制面板和模块
Webmin是一个Web界面,允许您通过浏览器管理配置文件和重新加载程序,而无需SSH连接到您的Linode。它是cPanel或Plesk等管理面板的流行替代品,并且包含许多使其受欢迎的功能。许多第三方模块适用于不同的用例,这有助于提高Webmin控制面板的灵活性。
小翼111
2018/08/20
2.6K0
如何在 Ubuntu 20.04 上安装 Webmin
本文最先发布在:https://www.itcoder.tech/posts/how-to-install-webmin-on-ubuntu-20-04/
雪梦科技
2020/05/22
2.9K0
如何在 Ubuntu 20.04 上安装 Webmin
如何在 CentOS 8 上安装 Webmin
Webmin 是一个开源控制面板,它允许你通过简单易用的 Web 界面,就可以管理你的 Linux 服务器。它允许你管理用户,组,磁盘配额,创建文件和目录,也能配置大多数流行的服务,包括 Web,FTP,Email 和数据库。
雪梦科技
2020/05/11
2.8K0
如何在 CentOS 8 上安装 Webmin
如何在Debian 9上安装Webmin
Webmin是适用于任何Linux机器的现代Web控制面板,允许您通过简单的界面管理服务器。使用Webmin,您可以动态更改常用软件包的设置。
新巴子
2018/11/08
2.5K0
如何在服务器上安装Webmin
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前Webmin支持绝大多数的Unix系统,可以让您用远端电脑上的浏览器,直接修改服务器里的使用者帐号、Apache、DNS、文件分享等设定。Virtualmin是Webmin的一个插件,它通过单一界面简化了对多个虚拟主机的管理,类似于cPanel或Plesk。使用Virtualmin,您可以管理用户帐户,Apache虚拟主机,DNS条目,MySQL数据库,邮箱等等。
葡萄
2018/08/02
3.9K0
如何在服务器上安装Webmin
在CentOS 7上安装Webmin
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前Webmin支持绝大多数的Unix系统,可以让您用远端电脑上的浏览器,直接修改服务器里的使用者帐号、Apache、DNS、文件分享等设定。
八十岁的背影
2018/07/25
4.9K0
在CentOS 7上安装Webmin
在Ubuntu 14.04上安装 Webmin
Webmin是一个开源的基于网页的Unix/Linux系统管理工具。通过使用Webmin,你可以在浏览器上设置和安装所有的系统服务,包括:DNS、DHCP、Apache、NFS和Samba等等。因此,有了这个,你就再也不需要去记住所有的修改配置的命令了。
星哥玩云
2022/07/01
1.8K0
在Ubuntu 14.04上安装 Webmin
Webmin <= 1.920 - 未经身份验证的RCE
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前Webmin支持绝大多数的Unix系统,这些系统除了各种版本的linux以外还包括:AIX、HPUX、Solaris、Unixware、Irix和FreeBSD等。
洛米唯熊
2019/08/20
3.4K0
Webmin <= 1.920 - 未经身份验证的RCE
在你的服务器上安装Webmin
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前Webmin支持绝大多数的Unix系统,可以让您用远端电脑上的浏览器,直接修改服务器里的使用者帐号、Apache、DNS、文件分享等设定。
爆栈工程师
2018/07/24
1.6K0
在你的服务器上安装Webmin
Linux 主机管理软件 Webmin 1.7 安装
Webmin 是一款基于 Web 的主机管理软件,该软件非常强大,几乎可以对主机进行所有的管理操作,如果对命令行管理主机不熟悉,可使用 Webmin,通过它,您可以轻松地管理主机用户帐户,磁盘配额,服务,配置文件,管理的Apache服务器,DNS,文件共享和其他东西。这是一个相当有用的管理工具。
星哥玩云
2022/07/03
2.7K0
Linux 主机管理软件 Webmin 1.7 安装
【说站】python模块如何安装
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
很酷的站长
2022/11/24
5650
【说站】python模块如何安装
在AlamaLinux上安装Webmin GUI服务器管理器
仍然不习惯使用 Linux 命令行?试试 Webmin,它是一个图形界面,可以帮助您管理和配置 Linux 服务器。
云云众生s
2024/07/07
1590
在AlamaLinux上安装Webmin GUI服务器管理器
Webmin RCE 漏洞复现
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。
sugarbeet
2022/09/26
1.4K0
Webmin RCE 漏洞复现
VPS安装Virtualmin面板
对一些Linxu操作不太熟悉的用户可以在VPS上安装web控制面板来简化添加网站或数据库等操作,常用的有cPanel、DirectAdmin、Virtualmin/Webmin、Kloxo这几种web控制面板,但是cPanel、DirectAdmin、Kloxo都是收费的控制面板,并且比较占用系统内存和资源,一般被空间销售商用作虚拟空间的销售;Virtualmin/Webmin是一款免费并且占用系统资源比较小的web控制面板,非常适合在VPS上安装。Hi-VPS强烈建议安装Virtualmin/Webmin作为VPS上的web控制面板.
星哥玩云
2022/07/04
18.1K0
VPS安装Virtualmin面板
已安装的nginx如何添加模块
nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so。这里以安装第三方ngx_http_google_filter_module模块为例: 1. 下载第三方扩展模块ngx_http_google_filter_module
菲宇
2019/06/12
12.7K0
Python如何安装cv2模块
关于用python实现答题卡识别的方法中,需用到cv2模块,在实际实验中,遇到了cv2模块安装失败的问题,本博客主要提出几个安装cv2的方法。
算法与编程之美
2022/05/23
8.2K0
python(pip)包/模块:如何离线安装?
如果有同环境服务器,可直接生成requirements.txt,会把当前服务器下的包和版本写入文件中。
Python学习者
2024/05/21
4690
CVE-2019-15107:Webmin RCE复现
本来前一阵就想复现来着,但是官网的版本已经更新了,直到今天才发现Docker上有环境,才进行了复现
Timeline Sec
2019/12/15
1.1K0

相似问题

X小时后从云存储中删除媒体

12

realm android删除所有数据

51

24小时后从Mysql中删除数据

21

Realm在删除PrimaryKey后未更改配置

16

Android Realm -删除后返回RealmObject

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档