2014-05-09 5 views
2

cub::DeviceScan functiona를 사용하고 sample code snippet에는 메모리를 할당하는 데 사용하는 temp_storage_bytes 매개 변수가 있습니다 (코드 조각은 결코 해제되지 않습니다).CUDA cub :: DeviceScan 및 temp_storage_bytes 매개 변수

코드 조각은 NULL 메모리에 대한 포인터가있는 cub::DeviceScan 함수를 호출하여 함수에 필요한 임시 장치 메모리의 필요한 양을 계산 한 다음 반환합니다. 필요한 임시 메모리는 cudaMalloc으로 할당되고이 메모리를 가리키는 함수 호출이 반복됩니다. 임시 메모리는 cudaFree (또는 아마도 있어야 함)으로 해제됩니다.

다른 플로트 어레이에서 장치 스캔을 여러 번 반복하지만 각 플로트 배열은 동일한 길이입니다.

제 질문은 temp_storage_bytes이 항상 같은 값일 것이라고 생각합니까? 그렇다면 많은 함수 호출에 대해 과 하나만 cudaFree을 수행 할 수 있습니다.

이 예제는 필요한 메모리가 결정되는 방법과 주어진 길이의 배열에 대해 변경 될 수 있는지 여부가 불분명합니다.

+1

의 양을 결정하는 cub::DeviceScan::InclusiveScan에 하나의 호출을 사용하고 있습니다. 그렇지 않으면'temp_storage_bytes'가 배열 요소 값에 의존한다는 것을 의미합니까? – JackOLantern

답변

2

동일한 길이의 다른 배열에 대해 cub::DeviceScan::InclusiveScan에 대한 호출을 반복하면 cub::DeviceScan::InclusiveScan에 대한 호출이 하나만 필요하다고 가정하여 임시 temp_storage_bytes 바이트의 양을 결정할 수 있습니다. 아래 예제에서는 같은 길이의 서로 다른 배열을 통해 여러 번 cub::DeviceScan::InclusiveScan를 호출하고 내가 네 말을 일시적 크기 -

// Ensure printing of CUDA runtime errors to console 
#define CUB_STDERR 

#include <stdio.h> 
#include <algorithm> // std::generate 

#include <cub/cub.cuh> // or equivalently <cub/device/device_scan.cuh> 
#include <thrust\device_vector.h> 
#include <thrust\host_vector.h> 

void main(void) 
{ 

    // Declare, allocate, and initialize device pointers for input and output 
    int num_items = 7; 

    thrust::device_vector<int> d_in(num_items); 
    thrust::device_vector<int> d_out(num_items); 

    // Determine temporary device storage requirements for inclusive prefix sum 
    void  *d_temp_storage = NULL; 
    size_t temp_storage_bytes = 0; 

    cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in.data(), d_out.data(), num_items); 

    // Allocate temporary storage for inclusive prefix sum 
    cudaMalloc(&d_temp_storage, temp_storage_bytes); 

    for (int k=0; k<10; k++) { 

     thrust::host_vector<int> h_in(num_items); 

     thrust::host_vector<int> h_out(num_items,0); 

     std::generate(h_in.begin(), h_in.end(), rand); 
     d_in = h_in; 

     // Run inclusive prefix sum 
     cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in.data(), d_out.data(), num_items); 

     int difference = 0; 
     int prev = 0; 
     for (int i=0; i<num_items; i++) { 
       h_out[i] = prev + h_in[i]; 
       prev = h_out[i]; 
       int val = d_out[i]; 
       printf("%i %i %i %i\n",i,difference,h_out[i],d_out[i]); 
       difference = difference + abs(h_out[i] - d_out[i]); 
     } 

     if (difference == 0) printf("Test passed!\n"); 
     else printf("A problem occurred!\n"); 

     h_in.shrink_to_fit(); 
     h_out.shrink_to_fit(); 

    } 

    getchar(); 

} 
+0

루프 반복마다 d_temp_storage를 해제하는 이유는 무엇입니까? – user2462730

+0

그것은 실수였습니다, 감사합니다. 나는 그것을 고쳤다. – JackOLantern