【问题标题】:Whats actually happens when you call cudaMalloc inside device?当您在设备内部调用 cudaMalloc 时实际发生了什么?
【发布时间】:2016-09-19 21:11:33
【问题描述】:

这实际上有效,所以我想知道 cuda 是否在线程中动态分配设备上的内存?如果是这样,__device__ malloc 的用途是什么,因为相比之下这要快得多?我问的是当你在内核中使用 cudaMalloc 时,幕后究竟发生了什么,因为它看起来比堆上的设备 malloc 快得多。

#include <iostream>
#include <numeric>
#include <stdlib.h>

__global__ void testMem(int* time){
    int* a;
    cudaMalloc(&a,sizeof(int));
    a[0] = 4;
    time = a[0];
}

__global__ void testMem2(int* time){

}
int main(){
    int* h_time = (int*)malloc(sizeof(int));
    h_time[0] =0;
    int* d_time;
    cudaMalloc(&d_time,sizeof(int));
    clock_t start1 = clock();
    cudaMemcpy(d_time,h_time,sizeof(int),cudaMemcpyHostToDevice);

    testMem<<<1,1>>>(d_time);
    cudaMemcpy(h_time,d_time,sizeof(int),cudaMemcpyDeviceToHost);
    cudaDeviceSynchronize();
    clock_t end1 = clock();

    int result = end1- start1;
    //float result = (float)*h_time;
    //result =result/ CLOCKS_PER_SEC;
    std::cout<<result<<std::endl;
    std::cout<<*h_time<<std::endl;
    //std::cout<<(1<<10);
    cudaFree(d_time);
    free(h_time);

}

【问题讨论】:

    标签: c++ cuda gpgpu


    【解决方案1】:

    从计算能力 3.5 开始,您可以在内核中使用部分 cuda 运行时 api。这些方法在文档中声明为__host__ __device__,就像here:

    __host__ ​ __device__ ​cudaError_t cudaMalloc ( void** devPtr, size_t size )

    在设备上分配内存。

    这样做时,请提醒链接到设备运行时库:cudadevrt.lib。

    还有另一种在设备上动态分配内存的方法:使用malloc,它的实现方式不同(记录在here)。它使用一个小的内存堆,并且不需要相同的计算能力。

    【讨论】:

    • 是否有任何地方可以了解在内核中调用 cudaMalloc 是如何实现的?在我开始切换我所有的 malloc 函数之前,我真的很想了解它。
    • @RockyZhang,好吧,我相信这是 cudadevrt 的一些内部实现的一部分。如果您需要有关该主题的更多详细信息,您可能需要注册为开发人员并直接向 NVIDIA 提问。但在我看来,这是题外话。
    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多