CUDA程序导致nvidia驱动程序崩溃

2024-04-19

当我超过大约 500 次试验和 256 个完整块时,我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃。这似乎发生在 monteCarlo 内核函数中。任何帮助都会受到赞赏。

#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <curand.h>
#include <curand_kernel.h>


#define NUM_THREAD 256
#define NUM_BLOCK 256



///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////

// Function to sum an array
__global__ void reduce0(float *g_odata) {
extern __shared__ int sdata[];

// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_odata[i];
__syncthreads();

// do reduction in shared mem
for (unsigned int s=1; s < blockDim.x; s *= 2) { // step = s x 2
    if (tid % (2*s) == 0) { // only threadIDs divisible by the step participate
        sdata[tid] += sdata[tid + s];
    }
    __syncthreads();
}

// write result for this block to global mem
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}

///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
__global__ void monteCarlo(float *g_odata, int  trials, curandState *states){
//  unsigned int tid = threadIdx.x;
    unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
    unsigned int incircle, k;
    float x, y, z;
    incircle = 0;

    curand_init(1234, i, 0, &states[i]);

    for(k = 0; k < trials; k++){
        x = curand_uniform(&states[i]);
        y = curand_uniform(&states[i]);
        z =(x*x + y*y);
        if (z <= 1.0f) incircle++;
    }
    __syncthreads();
    g_odata[i] = incircle;
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
int main() {

    float* solution = (float*)calloc(100, sizeof(float));
    float *sumDev, *sumHost, total;
    const char *error;
    int trials; 
    curandState *devStates;

    trials = 500;
    total = trials*NUM_THREAD*NUM_BLOCK;

    dim3 dimGrid(NUM_BLOCK,1,1); // Grid dimensions
    dim3 dimBlock(NUM_THREAD,1,1); // Block dimensions
    size_t size = NUM_BLOCK*NUM_THREAD*sizeof(float); //Array memory size
    sumHost = (float*)calloc(NUM_BLOCK*NUM_THREAD, sizeof(float));

    cudaMalloc((void **) &sumDev, size); // Allocate array on device
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);


    cudaMalloc((void **) &devStates, (NUM_THREAD*NUM_BLOCK)*sizeof(curandState));
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);


    // Do calculation on device by calling CUDA kernel
    monteCarlo <<<dimGrid, dimBlock>>> (sumDev, trials, devStates);
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);

        // call reduction function to sum
    reduce0 <<<dimGrid, dimBlock, (NUM_THREAD*sizeof(float))>>> (sumDev);
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);

    dim3 dimGrid1(1,1,1);
    dim3 dimBlock1(256,1,1);
    reduce0 <<<dimGrid1, dimBlock1, (NUM_THREAD*sizeof(float))>>> (sumDev);
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);

    // Retrieve result from device and store it in host array
    cudaMemcpy(sumHost, sumDev, sizeof(float), cudaMemcpyDeviceToHost);
    error = cudaGetErrorString(cudaGetLastError());
    printf("%s\n", error);


    *solution = 4*(sumHost[0]/total);
    printf("%.*f\n", 1000, *solution);
    free (solution);
    free(sumHost);
    cudaFree(sumDev);
    cudaFree(devStates);
    //*solution = NULL;
    return 0;
}

如果较少数量的试验工作正常,并且如果您在没有 NVIDIA Tesla 计算集群 (TCC) 驱动程序的 MS Windows 上运行和/或您使用的 GPU 连接到显示器,那么您可能超出了操作系统的“看门狗” “ 暂停。如果内核占用显示设备(或 Windows 上没有 TCC 的任何 GPU)时间过长,操作系统将杀死内核,以便系统不会变得非交互式。

解决方案是在非显示器连接的 GPU 上运行,如果您使用的是 Windows,请使用 TCC 驱动程序。否则,您将需要减少内核中的试验次数并多次运行内核来计算所需的试验次数。

编辑:根据CUDA 4.0 curand 文档 http://developer.download.nvidia.com/compute/cuda/4_0/toolkit/docs/CURAND_Library.pdf(第 15 页,“性能说明”),您可以通过将生成器的状态复制到内核内的本地存储来提高性能,然后在完成后将状态存储回来(如果您再次需要它):

curandState state = states[i];

for(k = 0; k < trials; k++){
    x = curand_uniform(&state);
    y = curand_uniform(&state);
    z =(x*x + y*y);
    if (z <= 1.0f) incircle++;
}

接下来,它提到设置成本很高,并建议您将 curand_init 移动到单独的内核中。这可能有助于降低 MC 内核的成本,这样您就不会遇到看门狗。

我建议阅读文档的该部分,其中有一些有用的指南。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA程序导致nvidia驱动程序崩溃 的相关文章

  • Android蓝牙权限问题

    首先 抱歉我的英语不好 我是西班牙人 并且是 Android 开发的新手 我正在开发一个简单的蓝牙文件发送器 我基于BluetoothChat android示例一步一步 现在我向用户发出蓝牙激活请求 并选择是或否选项应用程序崩溃 我拥有清
  • IntelliJ IDEA 中的 Android 开发导致电脑死机

    我使用 IntelliJ IDEA 10 5 进行 Android 开发 并使用最新的 Google USB 驱动程序 版本 4 进行调试 在 IntelliJ IDEA 中开发一段时间后 当通过 USB 连接 Android 设备 Nex
  • iPhone 4G 拍照时应用程序崩溃?

    我已从我的设备中拍摄照片并调整图像大小并将其设置到我的图像视图框架 但我的应用程序在拍摄照片后有时会崩溃 使用调整大小 现在我已经用 iPhone 4G 拍了这张照片 仅当许多应用程序在后台运行 多任务 时 应用程序才会崩溃 那么我该如何解
  • 无法在 Windows 7 上安装 Android USB 驱动程序

    所以我想使用我的新 Nexus 5 来调试我的应用程序 我尝试通过以下方式安装 Android USB 驱动程序装置经理 http developer android com tools extras oem usb html Win7但我
  • Python 应用程序崩溃并显示“PyEval_RestoreThread:必须在持有 GIL 的情况下调用该函数,但已释放 GIL”

    我有一个Python程序 因为它太大了 这里是它的源代码的链接 Link https github com zcg coder pyplussource 当我在 Mac 上运行它时 有时会遇到这个奇怪的异常 Fatal Python err
  • Visual Studio 2010 反复崩溃

    我运行 Visual Studio 2010 官方版本 已经有一段时间了 最近 在我每天 8 小时的工作日中 VS 崩溃了 10 多次 在 VS2008 中 处理大型 Xaml 文件时崩溃很常见 虽然我在 VS2010 中遇到过一些崩溃 但
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • CUDA Thrust 库中counting_iterators 的用途和用法

    我很难理解counting iterator在 CUDA 的推力库中 它的目的是什么以及如何使用 它在其他编程语言 例如 C 中也可用吗 计数迭代器只是一个迭代器 它从每次迭代器递增时前进的序列中返回下一个值 最简单的例子是这样的 incl
  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • Crashlytics 集成问题

    我在整合时遇到问题崩溃解决方案进入我的项目 按照网站上的说明进行操作 但不久之后安装 Crashlytics mac 应用程序 添加新的构建脚本 粘贴脚本 然后我构建我的项目以继续 然后应用程序崩溃了 Update 当时 我忘记在 AppD
  • 如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?

    我在 cpp 文件中对 cuSPARSE 库进行了一些调用 这些调用在旧工具包中不可用 为了支持使用旧工具包的系统 我想使用编译器指令编译不同的代码部分 特别是 我想使用旧工具包的 CSR 格式矩阵和新工具包的 BSR 格式矩阵来求解稀疏三
  • 对 CUDA 操作进行计时

    我需要计算 CUDA 内核执行的时间 最佳实践指南说我们可以使用事件或标准计时函数 例如clock 在Windows中 我的问题是使用这两个函数给出了完全不同的结果 事实上 与实践中的实际速度相比 事件给出的结果似乎是巨大的 我实际上需要这
  • 如何制作抗崩溃的ios应用程序

    我现在正在编写 ios 应用程序一段时间 但我的应用程序仍然经常崩溃 并且需要时间才能使它们变得非常稳定 我觉得这很烦人 那么 有没有关于防崩溃编程ios应用程序的编程模式呢 打开编译器警告 删除所有警告 运行静态分析器 删除所有警告 使用
  • 一维纹理内存访问比一维全局内存访问更快吗?

    我正在测量标准纹理和 1Dtexture 内存访问之间的差异 为此 我创建了两个内核 global void texture1D float doarray int size int index calculate each thread
  • 第三方dll导致程序崩溃,没有抛出异常

    我正在使用 Visual Studio 2010 并使用 C 进行编码 我有一个在我的项目中使用的第三方 dll 当我尝试使用特定方法时 在看似随机的情况下 程序只是崩溃 没有抛出任何异常 会议就这样结束了 有什么办法可以追踪正在发生的事情
  • 将数据从 GPU 复制到 CPU - CUDA

    我在将数据从 GPU 复制到 CPU 时遇到问题 一开始我在 GPU 空间中创建变量 device float gpu array 在此 GPU 函数中 我想将数据从 od fS gi 值 0 43 复制到 gpu array global
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每
  • NSCFData isRessized 崩溃?

    我目前在控制台中收到此崩溃日志 2011 08 23 19 18 40 064 App 1697 707 NSCFData isResizable unrecognized selector sent to instance 0x11f1c

随机推荐

  • 将 matlab 中的 find() 转换为 python

    我正在将代码从 Matlab 转换为 Python Matlab中的代码为 x find sEdgepoints gt 0 sNorm lt lowT sEdgepoints x 0 两个数组的大小相同 我基本上是在创建一个掩码 I rea
  • Xcode 14.0 - PackageIndex.findPackages 失败:featureDisabled 警告

    自从我升级到 Xcode 14 0 后 我收到以下警告 PackageIndex findPackages failed featureDisabled 网络搜索没有得到任何结果 我有一个SPM包 但似乎没有任何问题 有人知道如何摆脱这个警
  • 如何在部署的appengine数据库上的eclipse中调试服务器代码?

    我在 Eclipse 中有一个 Google AppEngine Java 项目 我想在 Eclipse 中调试本地代码 但使用 AppEngine 上部署的数据库 到目前为止 我使用带有用户名 密码的远程 API 旧方式 此方法将被弃用
  • 如何获取批处理文件中的字符串长度?

    似乎没有一种简单的方法可以获取批处理文件中字符串的长度 例如 SET MY STRING abcdefg SET A MY STRING LEN 我如何找到字符串的长度MY STRING 如果字符串长度函数处理字符串中所有可能的字符 包括转
  • Chrome 扩展 + 网页视图

    我正在努力寻找这个问题的明确答案 除 Chrome 操作系统外 所有操作系统均已弃用 Chrome 应用 只能在 Chrome 应用中使用 这意味着我不能或不应该在扩展中使用 如果可能 根据进一步的研究 测试和评论 绝对不能在扩展中使用 只
  • postbuild UIAutomation 脚本未在 jenkins 中运行

    我正在尝试做端到端自动化 for an iOS项目 我的目标是自动化持续集成处理与附加UIAutomation脚本作为构建后操作 因此 从用户在 SVN 中检查他的代码开始 直到我们得到自动化测试结果 一切都将是自动化的 Jenkins安装
  • 使用 fb_graph Ruby gem 从 Facebook 检索好友位置

    我正在尝试使用 gem 检索用户所有朋友的位置 fb graph https github com nov fb graph 版本1 7 2 我的权限是 发布流 读取好友列表 离线访问 好友位置 用户位置 我已经对用户进行了身份验证并存储了
  • “不支持”在不指定 RuntimeIdentifier 的情况下构建或发布独立的应用程序

    使用最新的 Visual Studio 2019 我尝试发布 DotNetCore 3 1 WPF 应用程序的 Msix 安装程序 应用程序构建并正确运行 但是当我尝试发布应用程序时出现此错误 It is not supported to
  • 迭代 DFS 与递归 DFS 以及不同的元素顺序

    我编写了一个递归 DFS 算法来遍历图 void Graph
  • eclipse 烦恼:调试和启动工具栏不可用

    我正在运行 Windows XP 和 Eclipse 4 2 2 Build id M20130204 1200 并且我丢失了调试和启动工具栏 我尝试过 Windows gt 重置透视 原始值 和窗口 gt 自定义透视 工具栏可见性和命令组
  • JavaScript 中的错误:对象不是函数

    当我运行下面的代码时 它显示错误object is not a function在控制台中 这个错误就在这一行var todo new Todo contents in my script js文件 我怎样才能让它发挥作用 这是我的 tod
  • 监控网络连接带宽的最佳工具

    我正在寻找一个非常简单的工具来监控所有应用程序的带宽 不需要流量监视等额外功能 我只是对带宽感兴趣 我已经知道 Wireshark 这很棒 但我正在寻找更多类似 TcpView 来自 Sysinternals 的出色工具 以及当前带宽指示的
  • Rails、activerecord 求和然后排序

    我有一个属于用户的工作模型 并且用户有很多工作 我想创建一个 AR 查询来计算每个用户的总工作日数 然后按降序排列 到目前为止 我已经有了这个 但给了我一个错误 列 Job id 必须出现在 GROUP BY 子句中或在聚合函数中使用 wo
  • Phonegap - 在插件委托中从 Objective-c 向 Javascript 发送消息

    我有一个 Phonegap Cordova 插件 在此插件中 我收到来自 javascript 的点击事件 此点击触发使用我的客户端库的文件下载 此文件下载发送事件并调用我的插件中的方法 因为我已将其设置为委托 我无法使用 stringBy
  • java.lang.NoSuchFieldError:没有 Landroidx/compose/foundation/layout/BoxScope$Companion 类型的字段 Companion;

    我是第一次使用 Jetpack Compose 但收到此错误 我还没有弄清楚问题到底出在哪里 但我正在使用单活动架构 如果需要更多信息 请通知我 根据错误信息 问题似乎出在脚手架上 val scaffoldState rememberSca
  • 添加应用程序时 Firebase 数据库被删除

    好的 所以我正在构建一个将在 Play 商店上运行的应用程序 它具有将数据添加到 Firebase 的功能 它无法读取数据 第二个应用程序将保留在我身边 它不会出现在游戏商店中 它用于读取数据 现在我所做的是 假设第一个应用程序有包名称 c
  • 有目的地回到之前的活动

    我有两个活动 当我在第一个活动上按 Enter 时 它将打开第二个活动 它包含一个ListView当我从中选择一个项目时ListView 它将获得其值并返回到第一个活动 这就是我尝试过的 在第二项活动中 listPerasat setOnI
  • R:随机采样抛硬币组

    我正在使用 R 编程语言 Suppose 有一枚硬币 如果它正面朝上 那么下一次抛掷正面的概率是 0 6 如果是反面 那么下一次抛掷反面的概率也是 0 6 一个班有100名学生 每个学生随机抛掷硬币几次 Student n 的最后一次抛硬币
  • Iframe/CSS:强制 Iframe 适合屏幕

    我目前正在尝试让 iframe 适合我的屏幕尺寸 以及任何其他以不同分辨率使用它的用户 除非无论我尝试什么 最终都会导致 iframe 太小或高度太大导致双滚动条 iframe 和页面本身有滚动条 我的目标是让 iframe 仅适合页面宽度
  • CUDA程序导致nvidia驱动程序崩溃

    当我超过大约 500 次试验和 256 个完整块时 我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃 这似乎发生在 monteCarlo 内核函数中 任何帮助都会受到赞赏 include