2011-07-25 6 views
1

CUDAcudppScanを使用して、要素の配列の接頭辞合計を計算しています。 入力データサイズが小さいとうまくいく。 しかし、データサイズが約700,000を超えると、出力のいくつかの要素が間違った値になります。入力データサイズが700,000を超えるとcudppscanが間違った出力を返します

私はすべて1の配列の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(); 
} 

だから私は間違っていた場所を指摘して助けてください。 ありがとうございます。

+0

また、私が使用した 'cudppScan'プロトタイプも[that]とは少し異なります(http://www.gpgpu.org/static/developer/cudpp/rel /rel_gems3/html/group__public_interface.html#gb72e7559d9e22c00ea6412d92b0efe11)公式サイトで公開されています。 – user435644

答えて

1

すぐにhttp://code.google.com/p/cudpp/issues/listに問題を提出してください。 CUDPP 2.0のリリース準備が整いました。もし問題があれば修正したいと思います。

"cudpp_testrig -scan -n = 670000"を実行すると問題が再現されますか?

また、SVN trunkから最新バージョンをチェックして、まだ失敗していないかどうかを確認してみてください。 (パスしたら、問題を提出しないでください)

+0

'cudpp_testrig -scan -n = 'もデータサイズがずっと小さくても失敗しました。私は[SVN repo](http://code.google.com/p/cudpp/source/checkout)からソースコードをチェックアウトしましたが、残念ながら私の 'GPU'アーキテクチャはサポートされていません。では、次に何をするのですか?ありがとう。 – user435644

+0

それは意味をなさない。あなたはどんなGPUを持っていますか? SVNのcudppScan()には、CUDPP 1.1.1が動作しても動作しなくなるという新機能はありません。どのようなエラーメッセージが表示されますか?もう一度、ここではなくcudpp.googlecode.comで問題を提出してください。 – harrism

関連する問題