Cuda存储功能提供“;“未知错误”;发送非常大的阵列时

Cuda存储功能提供“;“未知错误”;发送非常大的阵列时,cuda,labview,Cuda,Labview,我的程序分析一个视频文件,它被表示为一个3d数组,并从LabView发送到我的程序。LabView已经将这个3d数组展平为1d数组,所以我刚刚在CUDA中分配了一个1d数组,使用cudaMalloc,并使用cudaMemcpy复制数据。然而,我注意到,如果我发送的pixle图像超过2XXX、120x240,我会从我的一些cuda内存函数(CudamCpy和cudafree,在调用一些内核之后在我的程序中出现)中得到一个“未知错误”,这些错误最终会破坏我的程序。但是,如果我降低发送图像的数量,我不

我的程序分析一个视频文件,它被表示为一个3d数组,并从LabView发送到我的程序。LabView已经将这个3d数组展平为1d数组,所以我刚刚在CUDA中分配了一个1d数组,使用cudaMalloc,并使用cudaMemcpy复制数据。然而,我注意到,如果我发送的pixle图像超过2XXX、120x240,我会从我的一些cuda内存函数(CudamCpy和cudafree,在调用一些内核之后在我的程序中出现)中得到一个“未知错误”,这些错误最终会破坏我的程序。但是,如果我降低发送图像的数量,我不会有问题。这使我相信我的代码是好的,但我的内存分配实践是坏的

首先,让我们谈谈音调记忆。据我所知,这是关于选择一个好的大小来分配内存,这样线性数据就不会被分割成两个块。这对于二维和三维阵列尤其常见,因为您希望在内存中将行或列保持在一起,以便快速访问

如果我不使用音调记忆,这些问题会发生吗?如果不使用倾斜内存,特别是对于这些非常大的阵列,会发生哪些类型的错误?到目前为止,我忽略了使用CudamAllocPicch和cudaMalloc3d的选项,尽管我在技术上有2d和3d阵列,但我已经将其展平

最后,当cudaGetLastError只告诉我“未知错误”时,如何进一步调试代码中的问题?我能够找到哪个函数出了故障,但是当它像cudaFree一样出现问题时,我就没有办法调试这种东西,或者找出问题的根源


无论如何,谢谢你的帮助。

不使用倾斜内存的代价是速度。如果两个线程尝试访问视频的相邻帧,并且这些帧分配在连续内存中(没有对齐),则一个帧的部分将与另一个帧驻留在同一内存块或缓存线中,并且一个线程可能必须等待另一个线程完成其内存操作。可能不是致命的,但绝对不是最佳的。其中还可能存在先读后写或先写后写的问题

使用倾斜内存的成本是,如果您的元素(帧或扫描线)大小不是首选对齐边界的偶数倍,它将略微增加内存分配。下一帧或扫描线的开始可能需要填充几个字节,以使其在适当的内存地址边界上开始。为每个帧或扫描线大小添加30个字节,以获得2000帧的下一个适当边界,将为您的总内存分配添加大约60000个字节

如果总数据集不适合设备内存,则必须将数据集分成更小的数据块,并多次调用cuda内核来处理每个数据块。如果您的代码不需要一直随机访问整个数据集,那么切换到流模型可以大大减少您的总体处理时间。当一个warp正在等待其数据块加载到设备内存中时,另一个warp可以处理其数据块,因此CUDA内核不会处于空闲状态

如果您的视频处理代码需要查看(例如)4个连续的帧缓冲区来执行其工作,那么您可以设计一个缓冲区管理系统,在不再需要最旧的帧时从队列中退出,并设置一个新帧以准备下一次内核调用。更好的是,为新帧回收旧帧内存,以避免内存分配的开销

只在您实际需要时(或之前)加载您需要的内容。这就是20美元的视频播放器和录像机芯片如何在实际RAM很少的情况下实时处理数十亿字节的视频流