2016-03-23 3 views
1

Я смотрел пример кода для clfft. Я замечаю, что они продолжают присваивать значение err после каждого вызова функции.Какая точка проверки ошибок в этом коде?

err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths); 

/* Set plan parameters. */ 
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE); 
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED); 
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE); 

/* Bake the plan. */ 
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL); 

/* Execute the plan. */ 
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL); 

/* Wait for calculations to be finished. */ 
err = clFinish(queue); 

/* Fetch results of calculations. */ 
err = clEnqueueReadBuffer(queue, bufX, CL_TRUE, 0, N * 2 * sizeof(*X), X, 0, NULL, NULL); 

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

status = clfftSetPlanPrecision(bpm->fft_plan, bpm->float_type); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetLayout(bpm->fft_plan, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_FORWARD, 1.0f/(bpm->grid_size * bpm->grid_size)); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

    status = clfftSetResultLocation(bpm->fft_plan, CLFFT_OUTOFPLACE); 
    if(status != CLBPM_SUCCESS) 
     goto cleanup; 

Является ли пример кода просто плохой код или ошибка распространяющихся через вызовы функций?

+0

Последующее замедление 'err'. Это как-то особенное? – chux

+0

Вот ссылка на полный код (прокрутка вниз) https://github.com/clMathLibraries/clFFT err только типа cl_int – chasep255

+0

Не полный код. Определение 'type cl_int' не существует (AFAICT), возможно, в' CL/cl.h'. OTOH, я не ожидаю, что эта линия исследования поможет в любом случае. – chux

ответ

2

Мое предположение: ленивый программист (он же «плохой код»).

Вы правы, он просто выбрасывает каждое значение ошибки и не проверяет его.

Это не очень редко, так как, вероятно, он работает «большую часть времени», и пути ошибок редко используются.

+0

Вы бы просто не ожидали, что они сделают что-то подобное в главном примере на домашней странице своего сайта. – chasep255

+0

@ chasep255 Правда, но часто этот примерный код «страницы один» упрощен, чтобы сделать точку более четкой. Обычно это указывает на то, что, похоже, здесь не происходит. – unwind

+0

Раньше я использовал | = для серии ошибок, что, по-видимому, является вариацией этого. – Joshpbarron

5

Для меня это выглядит как улучшенный код. Это лучше, чем просто игнорировать возвращаемое значение, обычным способом, потому что вы можете увидеть фактическое возвращаемое значение во время отладки. В вашем примере, где не требуется специальной обработки ошибок, для лучшей удобочитаемости макрос может быть опцией:

#define ON_ERROR_GOTO_CLEANUP(status) if(status != CLBPM_SUCCESS) goto cleanup 

ON_ERROR_GOTO_CLEANUP(clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f)); 
+1

Отладочная точка на самом деле очень важна. При оптимизации все выключено, вероятно, существует «err» var и загружается из EAX (или что-то еще), даже если он не используется. На выпускной сборке со всеми opti. он, скорее всего, будет удален. –

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