2014-12-25 3 views
2

Я новичок в программировании CUDA. Я только что начал простую программу vector-Add, но ее выход ненормален.Как отлаживать программу CUDA? Выход ненормально

Мой код прилагается ниже:

__global__ 
void vecAddKernel(float* A, float* B, float* C, int n){ 
    int i = threadIdx.x + blockDim.x * blockIdx.x; 
    if(i < n){ 
     C[i] = A[i] + B[i]; 
    } 
} 


void vecAdd(float* A, float* B, float* C, int n){ 
    int size = n * sizeof(float); 
    float *d_A, *d_B, *d_C; 
    cudaMalloc((void**)&d_A, size); 
    cudaMemcpy(d_A, A, size, cudaMemcpyHostToDevice); 
    cudaMalloc((void**)&d_B, size); 
    cudaMemcpy(d_B, B, size, cudaMemcpyHostToDevice); 
    cudaMalloc((void**)&d_C, size); 
    vecAddKernel<<<ceil(n/256.0), 256>>>(d_A, d_B, d_C, n); 
    cudaMemcpy(C, d_C, size, cudaMemcpyDeviceToHost); 
    cudaFree(d_A); 
    cudaFree(d_B); 
    cudaFree(d_C); 
} 

int main(int argc, const char *argv[]) 
{ 
    float A[10] = {1,2,3,4,5,6,7,8,9,10}; 
    float B[10] = {10,20,30,40,50,60,70,80,90,100}; 
    float* C; 
    C = (float*)malloc(10); 
    memset(C, 0, 10*sizeof(float)); 
    vecAdd(A, B, C, 10); 
    for (int i = 0; i < 10; i++) { 
     printf("%f, ", C[i]); 
    } 
    printf("\n"); 
    return 0; 
} 

Мои CUDA является cuda-6.5 и gcc является gcc49. Он выводится следующим образом:

-9087809423414278337673035776.000000, 1.836612, -28609169409429209088.000000, 1.795911, 0.000000, 0.777735, -125923819520.000000, 1.807979, 585061501691794292736.000000, 1.826568 

Есть ли способ отладить эту программу? Что с ним происходит? Любая помощь приветствуется заранее.

ответ

4

У меня нет среды, чтобы проверить прямо сейчас, но я думаю, что проблема в вашей основной функции:

C = (float*)malloc(10); 

должен быть

C = (float*)malloc(10 * sizeof(float)); 

Не уверен, что если есть какие-либо другие проблемы ,

Для отладки программы CUDA, я обычно определяют функцию проверки ошибок и обертку макрос так:

#define checkCudaErrors(err) { __checkCudaErrors((err), __FILE__, __LINE__); } 
inline void __checkCudaErrors(cudaError_t err, const char *file, int line) 
{ 
    if (err != cudaSuccess) 
    { 
     fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n", file, line, (int)err, cudaGetErrorString(err)); 
     exit(-1); 
    } 
} 

и завернуть каждый API вызов CUDA с checkCudaErrors макросъемки:

checkCudaErrors(cudaMalloc((void**)&d_A, size)); 

Я нет эксперта, использующего CUDA, но надеюсь, что это помогло :-)

EDIT:

см Также в этом: What is the canonical way to check for errors using the CUDA runtime API?

И это лучше not casting the result of malloc in C:

C = malloc(10 * sizeof(float)); 
+1

Хороший ответ, и дополнительный кредит для предложений по ошибке проверки и т.д. Примечание, однако, что [литье результат таНос в C должно быть рекомендуется] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

+3

CUDA использует инструментальную цепочку на основе C++, и поэтому приведение результата 'malloc()' в указатель соответствующего типа необходимо. – njuffa

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