小编xhe*_*he8的帖子

如何管理CUDA内存?

当我运行仅分配少量全局内存(低于20 M)的CUDA程序时,出现"内存不足"错误.(从其他人的帖子中,我认为问题与内存碎片有关)我试着理解这个问题,并意识到我有几个与CUDA内存管理有关的问题.

  1. CUDA中是否有虚拟内存概念?

  2. 如果只允许一个内核同时在CUDA上运行,在终止后,它使用或分配的所有内存都将被释放?如果没有,这些内存何时免费发布?

  3. 如果允许在CUDA上运行多个内核,他们如何确保他们使用的内存不重叠?

谁能帮我回答这些问题?谢谢

编辑1:操作系统:x86_64 GNU/Linux CUDA版本:4.0设备:Geforce 200,它是连接到机器的GPUS之一,我不认为它是显示设备.

编辑2:以下是我做了一些研究后得到的结果.随意纠正我.

  1. CUDA将为每个主机线程创建一个上下文.此上下文将保留诸如内存的哪一部分(预先分配的内存或动态分配的内存)等信息已保留给此应用程序,以便其他应用程序无法写入该应用程序.当此应用程序终止(不是内核)时,将释放这部分内存.

  2. CUDA内存由链接列表维护.当应用程序需要分配内存时,它将通过此​​链接列表查看是否有可用于分配的连续内存块.如果找不到这样的块,即使总可用内存大小大于请求的内存,"内存不足"错误也会向用户报告.这就是与内存碎片有关的问题.

  3. cuMemGetInfo将告诉您有多少可用内存,但不一定是由于内存碎片而可以在最大分配中分配多少内存.

  4. 在Vista平台(WDDM)上,GPU内存虚拟化是可能的.也就是说,多个应用程序几乎可以分配整个GPU内存,WDDM将管理交换数据到主内存.

新问题:1.如果在应用程序终止后上下文中保留的内存将完全释放,则不应存在内存碎片.内存中必须留有某种数据.2.有没有办法重构GPU内存?

cuda nvidia gpu-programming

24
推荐指数
1
解决办法
1万
查看次数

CUDA中Malloc函数的效率

我正在尝试将一些 CPU 代码移植到 CUDA 中。我的CUDA卡是基于Fermi架构的,因此我可以使用设备中的malloc()函数来动态分配内存,而不需要对原始代码进行大量更改。(我的代码中多次调用了 malloc() 函数。)我的问题是这个 malloc 函数是否足够高效,或者如果可能的话我们应该避免使用它。我在 CUDA 上运行代码时没有得到太多加速,我怀疑这是由于使用 malloc() 函数引起的。

如果您有任何建议或意见,请告诉我。我感谢您的帮助。

malloc cuda

5
推荐指数
1
解决办法
3909
查看次数

在带有共享内存的 CUDA 中实现并行合并并不能提高性能

我正在尝试在 CUDA 中实现并行合并算法。该算法被设计为在一个线程块中执行。其基本思想是计算两个输入序列中每个元素的全局排名。由于这两个输入序列已排序,因此元素的全局排名等于其在原始序列中的索引加上其在通过二分搜索计算的另一个序列中的排名。我认为实现这种算法的最佳策略是将两个序列加载到共享内存中以减少全局内存读取。然而,当我比较两个版本的实现时,一种使用共享内存,一种不使用共享内存,我看不到性能的提高。我想知道我是否做错了什么。

硬件:GeForce GTX 285、Linux x86_64。

两种实现方式合并两个 1024 个元素的序列的时间约为 0.068672 ms。

__global__ void localMerge(int * A, int numA,int * B,int numB,int * C){
    extern __shared__ int  temp[]; // shared memory for A and B; 
    int tx=threadIdx.x;
    int size=blockDim.x;
    int *tempA=temp;
    int *tempB=temp+numA;
    
    int i,j,k,mid;
    //read sequences into shared memory 
    for(i=tx;i<numA;i+=size){
        tempA[i]=A[i];
    }
    for(i=tx;i<numB;i+=size){
        tempB[i]=B[i];
    }
    __syncthreads();
    //compute global rank for elements in sequence A
    for(i=tx;i<numA;i+=size){
        j=0;
        k=numB-1;
        if(tempA[i]<=tempB[0]){
            C[i]=tempA[i];
        }
        else if(tempA[i]>tempB[numB-1]){
            C[i+numB]=tempA[i];
        }
        else{
            while(j<k-1){
                mid=(j+k)/2;
                if(tempB[mid]<tempA[i]){
                    j=mid; …
Run Code Online (Sandbox Code Playgroud)

merge cuda gpu-shared-memory

0
推荐指数
1
解决办法
1741
查看次数