2016-03-03 3 views
2

Я пытаюсь создать собственный оператор сканирования в кубе. Он работает сейчас, но только для размеров массивов меньше 1024, что заставляет меня думать, что он работает только для блока. Вот мой код:определить пользовательский сканирующий оператор

#include "cub/cub.cuh" 
using namespace cub; 


typedef int mytype; 

struct CustomMin 
{ 
    template <typename T> 
    __host__ __device__ 
    CUB_RUNTIME_FUNCTION __forceinline__ 
    mytype operator()(const T &a, const T &b) const { 
     return (b < a) ? b : a; 
    } 
}; 


int main(int argc, char *argv[]) 
{ 

    int num_items = 512;  
    mytype *h_in; 
    mytype *h_out;   
    CustomMin min_op; 
    const size_t size = num_items * sizeof(mytype); 
    h_in = (mytype*)malloc(size); 
    h_out = (mytype*)malloc(size); 
    mytype *d_in = NULL; 
    cudaMalloc(&d_in, size); 
    mytype *d_out = NULL; 
    cudaMalloc(&d_out, size); 
    for (int i = 0; i < num_items; i++) { 
     h_in[i] = i; 
    } 
    cudaMemcpy(d_in, h_in, size, cudaMemcpyHostToDevice); 
    void *d_temp_storage = NULL; 
    size_t temp_storage_bytes = 0; 
    DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items); 
    cudaMalloc(&d_temp_storage, temp_storage_bytes); 
    DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items); 
    cudaMemcpy(h_out, d_out, size, cudaMemcpyDeviceToHost); 
    printf("done!\n"); 
    return 0; 
} 

Он всегда висит для больших размеров ввода.

+0

Я не могу скомпилировать этот код. Можете ли вы включить полный код, который я могу скомпилировать, не добавляя ничего или ничего не меняя. Например, ваш 'mytype' не определен, как ваш' g_allocator'. Если вы не уверены, то скопируйте то, что вы отправили в новый файл, и попытайтесь скомпилировать это. Исправьте это, чтобы он компилировался, а затем отредактируйте его обратно в вопрос. –

+1

Ваш предыдущий код был висит здесь: 'for (int i = 0; i

+0

Спасибо за проверку. Я выяснил, скомпилирую ли код на TitanX с sm_35, он будет висеть, но он будет работать с sm_52. Я думаю, это проблема CUB. – Mems

ответ

2

С CUB 1.4.1 я был в состоянии воспроизвести зависать при компиляции, как это:

nvcc -arch=sm_35 -o t25 t25.cu 

после изменения num_items в размещенном коде 2048.

По моему тестирования, появляется вопрос фиксируется в cub 1.5.1. Обновите последнюю версию CUB.

Смежные вопросы