-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());
}
ホスト変数を削減カーネルに渡しています。 – talonmies
@talonmies、どうしてそう思う? 'd_buf_f'を' reduce_min'に渡しています。ご覧のとおり、 'd_buf_f'は' cudaMalloc'で割り当てられました。 – Jihad
&min_logLumはホストアドレスです – talonmies