2016-05-23 4 views
1

これは実際にはうまくいきますので、スレッド内のデバイスに動的にメモリを割り当てているのでしょうか?もしそうなら、__device__ mallocの使用は何よりもはるかに高速ですから?私はカーネルでcudaMallocを使用するときにシーンの背後に本当に何が起こっているのかを尋ねています。ヒープ上のデバイスmallocよりもはるかに速く見えるからです。デバイス内でcudaMallocを呼び出すと実際に何が起こりますか?

#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); 

} 

答えて

1

計算機能3.5を開始すると、カーネル内でcudaランタイムAPIの一部を使用することができます。これらのメソッドは、ちょうどhereのように、ドキュメントの__host__ __device__として宣言されています

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

は、デバイス上のメモリを割り当てます。

この場合、デバイスランタイムライブラリ:cudadevrt.libにリンクするように通知します。

デバイスにメモリを動的に割り当てる別の方法があります。mallocの使用は、別様に実装されています(hereと記載されています)。小さなメモリヒープを使用しており、同じ計算機能を必要としません。

+0

カーネル内で呼び出されたときにcudaMallocがどのように実装されているかはどこにでもわかりますか?すべてのmalloc関数を切り替える前に、それをよく知りたいです。 –

+1

@RockyZhang、まあ、これはcudadevrtの内部実装の一部だと思います。トピックに関する詳細が必要な場合は、開発者として登録し、NVIDIAに直接質問することができます。しかし、私の意見では、これは話題外です。 –

関連する問題