driver.Context.synchronize()- 还有什么要考虑的 -- - 清理操作失败

2023-12-21

I have this https://stackoverflow.com/questions/12159709/cuda-out-of-memory-threads-and-blocks-issue-address-is-out-of-bounds/12230988#comment16400460_12230988代码在这里(由于答案而修改)。

Info

32 字节堆栈帧、0 字节溢出存储、0 字节溢出加载
ptxas info :使用了 46 个寄存器,120 字节 cmem[0],176 字节 cmem[2],76 字节 cmem[16]

我不知道为了使其适用于点“numPointsRs”和“numPointsRp”的不同组合还需要考虑什么

例如,当我运行 Rs=10000 和 Rp=100000 且 block=(128,1,1),grid=(200,1) 的代码时,就可以了。

我的计算:

46个寄存器*128线程=5888个寄存器。

我的卡限制 32768 个寄存器,所以 32768/5888=5 +some => 5 block/SM
(我的卡有限额6)。

通过占用率计算器,我发现使用 128 个线程/块 给我 42%,而且我的卡限额之内。

另外,每个 MP 的线程数为 640(限制为 1536)

现在,如果我尝试使用 Rs=100000 和 Rp=100000 (对于相同的线程和块),它会给我标题中的消息,其中:

cuEventDestroy 失败:启动超时

cuModuleUnload 失败:启动超时

1)我不知道/理解还需要计算什么。

2)我不明白我们如何使用/查找块的数量。我可以看到 大多数情况下,有人放置 (threads-1+points)/threads ,但这仍然 不起作用。

- - - - - - - 更新 - - - - - - - - - - - - - - - - - - ------------

使用 driver.Context.synchronize() 后,代码适用于很多点(1000000)!

但是,这个添加对代码有什么影响?(很多时候屏幕会冻结 1 分钟或更长时间)。我应该使用它吗?

--------------更新2------------------------------------ ------------

现在,如果不执行任何操作,代码将不再起作用!

代码快照:

import pycuda.gpuarray as gpuarray
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
import cmath
import pycuda.driver as drv
import pycuda.tools as t






#---- Initialization and passing(allocate memory and transfer data) to GPU -------------------------
Rs_gpu=gpuarray.to_gpu(Rs)
Rp_gpu=gpuarray.to_gpu(Rp)

J_gpu=gpuarray.to_gpu(np.ones((numPointsRs,3)).astype(np.complex64))
M_gpu=gpuarray.to_gpu(np.ones((numPointsRs,3)).astype(np.complex64))

Evec_gpu=gpuarray.to_gpu(np.zeros((numPointsRp,3)).astype(np.complex64))
Hvec_gpu=gpuarray.to_gpu(np.zeros((numPointsRp,3)).astype(np.complex64))
All_gpu=gpuarray.to_gpu(np.ones(numPointsRp).astype(np.complex64))

#-----------------------------------------------------------------------------------    
mod =SourceModule("""
#include <pycuda-complex.hpp>
#include <cmath>
#include <vector>

typedef  pycuda::complex<float> cmplx;
typedef float fp3[3];
typedef cmplx cp3[3];

__device__ __constant__ float Pi;

extern "C"{  


    __device__ void computeEvec(fp3 Rs_mat[], int numPointsRs,   
         cp3 J[],
         cp3 M[],
         fp3 Rp,
         cmplx kp, 
         cmplx eta,
         cmplx *Evec,
         cmplx *Hvec, cmplx *All)

{

            while (c<numPointsRs){

        ...                      
                c++;

                }        
        }


__global__  void computeEHfields(float *Rs_mat_, int numPointsRs,     
        float *Rp_mat_, int numPointsRp,     
    cmplx *J_,
    cmplx *M_,
    cmplx  kp, 
    cmplx  eta,
    cmplx E[][3],
    cmplx H[][3], cmplx *All )
    {

        fp3 * Rs_mat=(fp3 *)Rs_mat_;
        fp3 * Rp_mat=(fp3 *)Rp_mat_;
        cp3 * J=(cp3 *)J_;
        cp3 * M=(cp3 *)M_;


    int k=threadIdx.x+blockIdx.x*blockDim.x;

      while (k<numPointsRp)  
     {

        computeEvec( Rs_mat, numPointsRs,  J, M, Rp_mat[k], kp, eta, E[k], H[k], All );
        k+=blockDim.x*gridDim.x;

    }

}
}

""" ,no_extern_c=1,options=['--ptxas-options=-v'])


#call the function(kernel)
func = mod.get_function("computeEHfields")

func(Rs_gpu,np.int32(numPointsRs),Rp_gpu,np.int32(numPointsRp),J_gpu, M_gpu, np.complex64(kp), np.complex64(eta),Evec_gpu,Hvec_gpu, All_gpu, block=(128,1,1),grid=(200,1))


#----- get data back from GPU-----
Rs=Rs_gpu.get()
Rp=Rp_gpu.get()
J=J_gpu.get()
M=M_gpu.get()
Evec=Evec_gpu.get()
Hvec=Hvec_gpu.get()
All=All_gpu.get()

My card:

Device 0: "GeForce GTX 560"
  CUDA Driver Version / Runtime Version          4.20 / 4.10
  CUDA Capability Major/Minor version number:    2.1
  Total amount of global memory:                 1024 MBytes (1073283072 bytes)
  ( 0) Multiprocessors x (48) CUDA Cores/MP:     0 CUDA Cores   //CUDA Cores    336 => 7 MP and 48 Cores/MP

您必须处理很多问题。 @njuffa 提供的答案 1 是最好的通用解决方案。我将根据您提供的有限数据提供更多反馈。

  1. PTX输出的46个寄存器并不是你的内核使用的寄存器数量。 PTX 是一种中间表示。离线或 JIT 编译器会将其转换为设备代码。设备代码可能使用更多或更少的寄存器。 Nsight Visual Studio Edition、Visual Profiler 和 CUDA 命令行分析器都可以为您提供正确的寄存器计数。

  2. 占用率计算并不是简单的RegistersPerSM / RegistersPerThread。寄存器是根据粒度来分配的。对于 CC 2.1,粒度是每个线程每个线程 4 个寄存器(128 个寄存器)。 2.x 设备实际上可以以 2 寄存器粒度进行分配,但这可能会导致稍后在内核中产生碎片。

  3. 在您的入住率计算中您注明

我的卡限制 32768 个寄存器,所以 32768/5888=5 +some => 5 block/SM (我的卡有限额6)。

我不确定 6 是什么意思。您的设备有 7 个短信。 2.x 设备的每个 SM 的最大块数为每个 SM 8 个块。

  1. 您提供的代码量不足。如果您提供代码片段,请提供所有输入的大小、每个循环执行的次数以及每个函数操作的描述。查看代码,您可能每个线程执行了太多循环。在不知道外循环的数量级的情况下,我们只能猜测。

  2. 鉴于启动超时,您可能应该按如下方式进行调试:

A。在代码开头添加一行

if (blockIdx.x > 0) { return; }

运行前面提到的分析器之一中的确切代码来估计单个块的持续时间。使用探查器提供的启动信息:每个线程注册、共享内存……使用探查器或 xls 中的占用计算器来确定可以同时运行的最大块数。例如,如果理论块占用率为每个 SM 3 个块,并且 SM 数量为 7,则您一次可以运行 21 个块,即发射 9 波。注意:这假设每个线程的工作量相等。更改提前退出代码以允许 1 波(21 个区块)。如果此启动超时,那么您需要减少每个线程的工作量。如果通过了,则计算您有多少次波,并估计何时超时(在 Windows 上为 2 秒,在 Linux 上?)。

b.如果你有太多的波浪,那么就必须减少发射配置。鉴于您通过 gridDim.x 和 blockDim.x 进行索引,您可以通过将这些维度作为参数传递给内核来完成此操作。这将要求您最少地更改索引代码。您还必须传递 blockIdx.x 偏移量。更改主机代码以连续启动多个内核。由于不应该存在冲突,因此您可以在多个流中启动它们,以便从每波结束时的重叠中受益。

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

driver.Context.synchronize()- 还有什么要考虑的 -- - 清理操作失败 的相关文章

  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • CUDA、NPP 滤波器

    CUDA NPP 库支持使用 nppiFilter 8u C1R 命令过滤图像 但不断出现错误 我可以毫无问题地启动并运行 boxFilterNPP 示例代码 eStatusNPP nppiFilterBox 8u C1R oDeviceS
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 内联 PTX 汇编代码强大吗?

    我看到一些代码示例 人们在 C 代码中使用内联 PTX 汇编代码 CUDA工具包中的文档提到PTX很强大 为什么会这样呢 如果我们在 C 代码中使用这样的代码 我们会得到什么好处 内联 PTX 使您可以访问未通过 CUDA 内在函数公开的指
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • PyInstaller 是否包含 CUDA

    我正在开发一个Python脚本 我使用Python 3 7 3 它使用tensorflow gpu 1 14 0 并使用PyInstaller 3 5将此脚本转换为可执行文件 我使用的是 CUDA 10 0 和 cuDNN 7 6 1 我的
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • CUDA 的嵌套循环

    我想将我的 C 代码移植到 CUDA 主要计算部分包含3个for嵌套循环 for int i 0 i lt Nx i for int j 0 j
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 在 CUDA 中的设备内存上分配 2D 数组

    如何在 Cuda 中的设备内存中分配和传输 往返于主机 2D 数组 我找到了解决这个问题的方法 我不必展平阵列 内置的cudaMallocPitch 函数完成了这项工作 我可以使用以下命令将阵列传输到设备或从设备传输阵列cudaMemcpy
  • 直接在主机上访问设备向量元素的最快方法

    我请您参考以下页面http code google com p thrust wiki QuickStartGuide Vectors http code google com p thrust wiki QuickStartGuide V
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n
  • 将数据从 GPU 复制到 CPU - CUDA

    我在将数据从 GPU 复制到 CPU 时遇到问题 一开始我在 GPU 空间中创建变量 device float gpu array 在此 GPU 函数中 我想将数据从 od fS gi 值 0 43 复制到 gpu array global

随机推荐

  • 在 Python 中创建和维护多个 ssh 会话

    一旦我的程序启动 它就会打开任意数量的 ssh 会话 用户定义 并无限期地在服务器上运行特定命令 当真正循环时 或直到用户退出 出于效率原因 我只想创建每个会话一次 然后能够运行命令直到用户退出 我怎样才能在Python中做到这一点 我在另
  • Javascript::audio.pause是否将audio.currentTime值重置为0?

    我的代码运行完美except事实上 它不是暂停曲目 而是返回到曲目的开头 这是我的代码 var audio new Audio var hezi document querySelector player gt button hand va
  • 如何让两个 JAR 在“docker run 容器”上自动启动

    我希望通过 run 命令调用 docker 容器后自动执行两个单独的 JAR 文件 因此当我输入docker run mycontainer他们都被称为 到目前为止 我有一个如下所示的 dockerfile base image is ja
  • 在文本框中搜索单词并将光标移动到文本框中的下一个匹配项?

    我目前有一个小部件 可以搜索我的主文本框并突出显示与我的搜索匹配的单词 我遇到的问题是找到一种方法将光标移动到找到的第一个匹配项 然后在下次按 Enter 时将光标移动到找到的下一个匹配项 我有两种方法可以在文本框中搜索单词 一种方法是查找
  • 如何使用 Greasemonkey 单击此按钮?

    我是 JS 的新手 我正在尝试单击此按钮 a class simplebutton href find a 该按钮的 XPath 是 html body div 5 div span 2 a 并且可以在以下位置查看目标页面的快照这个小提琴
  • CompositeTransform 只在 silverlight 中使用吗?

    CompositeTransform仅用于silverlight 我们是否可以在 WPF 中使用它或任何等效的替代品 没有CompositeTransform然而在WPF中有一个TransformGroup 因此 等效替换是Transfor
  • 使用 Text::CSV_XS 模块将列插入 Perl 中的 CSV 文件

    如何使用 Text CSV XS 模块将列添加到 CSV 文件 模块中的打印例程仅将数组写入一行 如果我有一个数组 如何将其作为列写入文件 我已经写了下面的代码 open my outFH gt outFile or die outFile
  • 如何将椭圆动画路径旋转一定角度?

    我使用以下方法来获取实体随时间沿椭圆路径行进时的 x 和 y 位置 x Math cos time width 2 y Math sin time height 2 有没有一种简单的方法可以将整个物体旋转一定的度数 例如 45 度或 132
  • KendoUI 集成到 Durandal JS

    我正在构建一个phonegap 应用程序 并计划使用 Telerik 的 Kendo UI 框架来生成 UI Telerik Kendo UI 已经有一个 MVVM 实现 我想使用它而不包括 Knockout JS 这是支持的东西 还是 D
  • 在 Webview 中清除用户的 Facebook 会话

    我有一个 WebView 它允许用户将图像分享到 Facebook 这个过程涉及他们登录 FB 完成后 我销毁 WebView 应用程序重置 并向不同的用户提供相同的功能 目的是让 WebView 不从一个会话到下一个会话保持登录状态 但是
  • 如何使用 Android SDK Manager 安装 NDK

    据说可以用Android SDK manager来安装NDK 如下图 不幸的是 我没有SDK Plantforms SDK Tools and SDK Update Sites我的 SDK 管理器中的选项卡 我的图片如下 那么我的情况如何安
  • 在设备树中注册 snd-soc-dummy

    我正在尝试在我的设备树源文件中注册 soc utils 中提供的 ALSA 虚拟编解码器 以将其与 i2s 设备驱动程序 sun8i i2s 一起使用 我尝试在 i2s 配置中设置 sound dai 字段 如下所述 https patch
  • PHP有peek数组操作吗?

    我想查看数组的第一个元素 此操作等效于以下代码 function peek list item array shift list array unshift list item return item 这段代码对我来说似乎真的很重 并且 p
  • 当我绘图时如何消除线条之间的这些“点”?

    is there an easy way to not draw this points in my lines I don t know why this points are there because i never release
  • 如何永久运行 Ionic 服务?

    我正在为一个应用程序使用 Ionic 框架 代码位于Linux服务器上 我正在使用运行应用程序ionic serve通过腻子命令 但是 问题是如果我关闭腻子 应用程序就会停止 有没有办法让离子服务作为守护进程永久运行 我怀疑您尝试这样做是因
  • IIS发布后如何修复CSS中的图像路径?

    我是 MVC V4 新手 在将网站发布到 IIS 后遇到问题 通过 Web 浏览器 和页面检查器 在 IIS Express 中查看时 我的网站运行良好 然而 当我将我的网站 通过 VS2012 发布到 IIS 时 我的 CSS 引用的所有
  • 无法显示png

    我正在虚拟机 Red Hat Enterprise Linux Server 版本 6 4 上运行 R shiny R 版本 3 0 1 2013 05 16 一切正常 即服务器启动 应用程序运行等 只要我不尝试绘制图表 renderPlo
  • 如何在 C++ 中使用复数“i”

    我现在正在编写一个简单的 DFT 算法 我想在复指数中使用复数 i 我看到有人用 include
  • 自定义 UIView 类 - Swift

    我已经构建了一个从底部出现并在一段时间后隐藏的视图 它运行良好 但我想将其放入UIView类作为模态 我浏览了互联网 但我无法理解或理解如何做到这一点 snake UIView frame CGRect x 0 y self view fr
  • driver.Context.synchronize()- 还有什么要考虑的 -- - 清理操作失败

    I have this https stackoverflow com questions 12159709 cuda out of memory threads and blocks issue address is out of bou