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()- 还有什么要考虑的 -- - 清理操作失败 的相关文章

  • 如何用Go语言的cgo编译Cuda源码?

    我用 cuda c 编写了一个简单的程序 它可以在 eclipse nsight 上运行 这是源代码 include
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • cudaMemcpyToSymbol 的问题

    我正在尝试复制到恒定内存 但我不能 因为我对 cudaMemcpyToSymbol 函数的用法有误解 我正在努力追随this http developer download nvidia com compute cuda 4 1 rel t
  • 使用 QuasirandomGenerator (对于傻瓜来说)

    我是 CUDA 的新手 我正在努力在内核中生成随机数 我知道有不同的实现 而且 在 SDK 4 1 中有一个 Niederreiter 拟随机序列生成器的示例 我不知道从哪里开始 我有点悲伤 感觉自己像个傻瓜 有人可以制作一个使用 Nied
  • 如何使用Python在多进程中运行pycuda

    我有一个可以在单个进程中运行的 pycuda 代码 python的多进程可以支持在多个子进程中运行这段代码吗 如果我尝试 我会发现我犯了一个错误 我做错了吗 我尝试用python的进程实现一个简单的多进程 发现会出错 import pycu
  • 在linux上编译一个基本的OpenCV + Cuda程序

    我过去在linux上使用过opencv 但没有使用过cuda 几个月来我一直在与以下编译错误作斗争 在尝试了许多解决方案后 我放弃并使用 Windows 不过 我真的很想在 Linux 上工作 这是我用来编译 opencv gpu 网站上给
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 运行时 API 应用程序中的 cuda 上下文创建和资源关联

    我想了解如何在 cuda 运行时 API 应用程序中创建 cuda 上下文并与内核关联 我知道这是由驱动程序 API 在幕后完成的 但我想了解一下创作的时间线 首先 我知道 cudaRegisterFatBinary 是第一个 cuda a
  • CUDA 估计 2D 网格数据的每块线程数和块数

    首先我要说的是 我已经仔细阅读了所有类似的问题 确定每个块的线程和每个网格的块 https stackoverflow com questions 4391162 cuda determining threads per block blo
  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 将 nvidia 运行时添加到 docker 运行时

    我正在运行虚拟机GCP配备特斯拉 GPU 并尝试部署一个PyTorch基于应用程序使用 GPU 加速 我想让 docker 使用这个 GPU 可以从容器访问它 我设法在主机上安装了所有驱动程序 并且该应用程序在那里运行良好 但是当我尝试在
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do
  • CUDA Thrust 的多 GPU 使用

    我想使用我的两张显卡通过 CUDA Thrust 进行计算 我有两张显卡 在单卡上运行对于两张卡都适用 即使我在 std vector 中存储两个 device vector 也是如此 如果我同时使用两张卡 循环中的第一个周期将起作用并且不
  • CUDA NSight 未随 Windows 8 上的 CUDA 5.0 安装文件一起安装? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 据我所知 Nvidia 网站上没有 Nsight Eclipse 的下载链接 它说它将由 CUDA 5 安装本机安装 但并没有随CUDA安装一起安装
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一

随机推荐

  • 在 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