2017-01-23 2 views
-1

私はUdacityコース並列プログラミングのための宿題#3を完成しようとしています。私は、次のCUDAエラーに走っている:私は配列を減らすことを意図しているカーネルを起動したときUdacity並列プログラミング、不特定の起動失敗

CUDA error at: student_func.cu:150 
unspecified launch failure cudaGetLastError() 

エラーが発生しました。ここで

は私のCUDAコードは(すべてがcopy_fで結構です)です:

__global__ 
void copy_f(const float* const d_src, 
      float* const d_dst, 
      size_t length) { 
    size_t pos = blockIdx.x * blockDim.x + threadIdx.x; 
    if (pos >= length) { 
    return; 
    } 
    d_dst[pos] = d_src[pos]; 
} 

__global__ 
void reduce_min(float* const d_buf, 
       float* global_min_value, 
       size_t length) { 
    size_t pos = blockIdx.x * blockDim.x + threadIdx.x; 

    while (length > 1) { 
    size_t mid = (length + 1) >> 1; 
    if (pos >= 2 * mid) { 
     return; 
    } 
    if (pos >= mid) { 
     float min_value = 1.f; 
     if (pos < length) { 
     min_value = d_buf[pos]; 
     } 
     if (d_buf[pos - mid] > min_value) { 
     d_buf[pos - mid] = min_value; 
     } 
    } 
    __syncthreads(); 
    length = mid; 
    } 
    if (pos == 0) { 
    *global_min_value = d_buf[0]; 
    } 
} 

そして、それを使用している機能:

float *d_buf_f; 
unsigned int *d_hist, *d_buf_ui; 

void your_histogram_and_prefixsum(const float* const d_logLuminance, 
            unsigned int* const d_cdf, 
            float &min_logLum, 
            float &max_logLum, 
            const size_t numRows, 
            const size_t numCols, 
            const size_t numBins) 
{ 
    // Step 0: Setting kernels and allocating memory 
    const size_t length = numRows * numCols; 
    const size_t blockCols = 512; 
    const size_t gridCols = (length + blockCols - 1)/blockCols; 
    const dim3 blockSize(blockCols, 1, 1); 
    const dim3 gridSize(gridCols, 1, 1); 

    checkCudaErrors(cudaMalloc(&d_buf_f, sizeof(float) * length)); 
    checkCudaErrors(cudaMalloc(&d_hist, sizeof(unsigned int) * numBins)); 
    checkCudaErrors(cudaMalloc(&d_buf_ui, sizeof(unsigned int) * numBins)); 

    // Step 1: Min and max 
    copy_f<<<gridSize, blockSize>>>(d_logLuminance, d_buf_f, length); 
    cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); 
    reduce_min<<<gridSize, blockSize>>>(d_buf_f, &min_logLum, length); 
    cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); 

    // Step 5: Releasing memory 
    checkCudaErrors(cudaFree(d_buf_f)); 
    checkCudaErrors(cudaFree(d_hist)); 
    checkCudaErrors(cudaFree(d_buf_ui)); 

    cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); 
} 
+1

ホスト変数を削減カーネルに渡しています。 – talonmies

+0

@talonmies、どうしてそう思う? 'd_buf_f'を' reduce_min'に渡しています。ご覧のとおり、 'd_buf_f'は' cudaMalloc'で割り当てられました。 – Jihad

+0

&min_logLumはホストアドレスです – talonmies

答えて

1

問題の原因はこれです:

reduce_min<<<gridSize, blockSize>>>(d_buf_f, &min_logLum, length); 

&min_logLumは裸のホストアドレスで、カーネル。これは、デバイスメモリ内の有効なアドレスに置き換える必要があります。

これを修正した後、カーネルが1つのブロックを実行している場合のみ、カーネルが正しく動作することがわかります。カーネルには修正が必要な設計上の問題があります。 NVIDIAからのこのの還元カーネルの設計についての非常に良い議論があります。私はそれを読むことをお勧めします。

関連する問題