Cudppscan дает неправильный вывод, когда размер входных данных превышает 700000

Я использую CUDAcudppScan вычислить префикс-сумму массива элементов. Это хорошо, когда размер входных данных невелик. Но когда размер данных превышает 700 000, некоторые элементы выходных данных оказываются неправильными значениями.

я делаю cudppScan из массива всех, поэтому выход должен быть 1, 2, 3, 4, ...,

Вот мой код:

void
runTest( int argc, char** argv) 
{
    // use command-line specified CUDA device, otherwise use device with highest Gflops/s
    if( cutCheckCmdLineFlag(argc, (const char**)argv, "device") )
        cutilDeviceInit(argc, argv);
    else
        cudaSetDevice( cutGetMaxGflopsDeviceId() );

    int num_elements = 670000;

    int *h_isCommon;
    int *d_isCommon;
    int *d_scan_odata;

    h_isCommon = (int *) malloc(sizeof(int) * num_elements);
    CUDA_SAFE_CALL(cudaMalloc((void**)&d_isCommon,   sizeof(int) * num_elements));
    CUDA_SAFE_CALL(cudaMalloc((void**)&d_scan_odata, sizeof(int) * num_elements));

    for(int i = 0; i < num_elements; i++) h_isCommon[i] = 1;
    CUDA_SAFE_CALL(cudaMemcpy(d_isCommon, h_isCommon, sizeof(int) * num_elements, 
        cudaMemcpyHostToDevice));


    CUDPPConfiguration config;
    CUDPPHandle scanplan;

    config.op           = CUDPP_ADD;
    config.datatype     = CUDPP_INT;
    config.algorithm    = CUDPP_SCAN;
    config.options      = CUDPP_OPTION_FORWARD | CUDPP_OPTION_INCLUSIVE;
    scanplan = 0;
    CUDPPResult result_cudpp = cudppPlan(&scanplan, config, 4000000, 1, 0);


    cudppScan(scanplan, d_scan_odata, d_isCommon, num_elements);
    CUDA_SAFE_CALL(cudaThreadSynchronize());

    CUDA_SAFE_CALL(cudaMemcpy(
            h_isCommon, 
            d_scan_odata, 
            sizeof(int) * num_elements, 
            cudaMemcpyDeviceToHost));

    for(int i = 1; i < num_elements; i++) {
        if(h_isCommon[i] != h_isCommon[i - 1] + 1)
            printf("error %d, %d\n", h_isCommon[i], h_isCommon[i - 1]);
        //if(i != 0 && i % 10 == 0) printf("\n");
        //printf("%8d", h_isCommon[i]);
    }
    printf("\n");

    CUDA_SAFE_CALL(cudaFree(d_isCommon));
    CUDA_SAFE_CALL(cudaFree(d_scan_odata));
    free(h_isCommon);
    cudaThreadExit();
}

Поэтому, пожалуйста, помогите указать, где я ошибся. Заранее спасибо.

1 ответ

Пожалуйста, отправьте вашу проблему на http://code.google.com/p/cudpp/issues/list КАК МОЖНО СКОРЕЕ. Мы готовим CUDPP 2.0 к выпуску, и мы хотели бы исправить проблему, если таковая имеется.

Проблема воспроизводится, если вы запускаете "cudpp_testrig -scan -n=670000"?

Кроме того, если вы можете проверить последнюю версию из магистрали SVN и попробовать с ней, чтобы увидеть, если она все еще не работает, это поможет нам. (Если это проходит, не регистрируйте проблему.)

Другие вопросы по тегам