2016-12-06 106 views
0

我想了解指针如何在CUDA中运行。无法在CUDA的内核中打印设备变量值

下面给出的是一个简单的程序,它为设备中分配的变量赋予一定的值。 (我使用CUDA工具包8.0与NVIDIA Quadro K2000显卡)

当我使用printf()在内核中打印值时,它显示错误的值。

然而,当我从主机功能做了cudaMemcopy,然后从主机功能打印,它会显示正确的值...

//CODE... 
#include <stdio.h> 
#include <stdlib.h> 
#include<cuda.h> 
#include<cuda_runtime.h> 
#define N 3 

__global__ void tempker(int *jk,int value) 
{ 
    (*jk) = value*2; 
    printf("displayed from inside the kernel :\nvalue of jk = %d\nvalue of *jk = %d\n",jk,*jk); 

} 
int tempfunc(int *kp) 
{ 
    int *jk = NULL,*lm=NULL; 
    lm = (int *)(malloc(sizeof(int))); 
    *lm = 150; 
    cudaError_t err = cudaSuccess; 
    cudaMalloc((void**)&jk, sizeof(int)); 
    printf("jk pointer after cudaMalloc: displayed from host = %d\n",jk); 
    tempker<<<1,1>>>(jk,150); 
    err = cudaGetLastError();//brief Returns the last error from a runtime call 
    cudaDeviceSynchronize(); 

    err = cudaMemcpy(lm, jk, (sizeof(int)), cudaMemcpyDeviceToHost); 
    if (err != cudaSuccess) 
    { 
     fprintf(stderr, "Failed to copy jk from device to host (error code %s)!\n", cudaGetErrorString(err)); 
     exit(EXIT_FAILURE); 
    } 
    printf("Displayed in host function after memcopy: value of *lm = *jk = %d\n",*lm); 
    cudaFree(jk); 
    err = cudaMalloc((void**)&kp, sizeof(int)); 
    if (err != cudaSuccess) 
    { 
     fprintf(stderr, "Failed to allocate device kp (error code %s)!\n", cudaGetErrorString(err)); 
     exit(EXIT_FAILURE); 
    } 
    tempker<<<1,1>>>(kp,(N*N*N)); 
    err = cudaGetLastError();//brief Returns the last error from a runtime call 
    cudaDeviceSynchronize(); 

    err = cudaMemcpy(lm, kp, (sizeof(int)), cudaMemcpyDeviceToHost); 
    if (err != cudaSuccess) 
    { 
     fprintf(stderr, "Failed to copy kp from device to host (error code %s)!\n", cudaGetErrorString(err)); 
     exit(EXIT_FAILURE); 
    } 
    printf("Displayed in host function after memcopy: value of *lm = *kp = %d\n",*lm); 
    cudaFree(kp); 
    free(lm); 
    return 100; 
} 

int main(){ 

    int *kp = NULL; 
    printf("tempfunc(): return value = %d\n",tempfunc(kp)); 
    return 0; 
} 

输出:

jk pointer after cudaMalloc: displayed from host = 13238272 
displayed from inside the kernel : 
value of jk = 13238272 
value of *jk = 9 
Displayed in host function after memcopy: value of *lm = *jk = 300 
displayed from inside the kernel : 
value of jk = 13238272 
value of *jk = 9 
Displayed in host function after memcopy: value of *lm = *kp = 54 
tempfunc(): return value = 100 

的问题是: 是否可以在内核中打印设备中分配的变量的值?

+0

我不明白你的问题。你的代码*是打印出内核中设备变量的值。是什么让你觉得它不是? – talonmies

+0

然而,它打印错误的值,例如,当内核启动时,* jk应该= 150 * 2 = 300.但在内核中,它打印'9'... –

回答

0

显示整数值“%d”被认为是正确的。 使用显示地址“%d”可能会导致不可预知的行为,具体取决于您的编译器。

只需使用“%p”。因为它期望一个空指针,所以明确地施放你的指针。

所以在你的内核:如果你深入了解一下printf

printf("value = %d, address = %p\n",*jk,(void *)jk); 

更多信息可用。

+0

伟大...当我改变% d与指针的%p一样,它会从内核中打印出正确的值......(正如您所说的,用于显示地址的%d导致显示错误结果(9而不是300和54)的不可预知的行为。 ..)现在这段代码在内核中打印正确的值(300,第一次和54,第二次在内核中)....谢谢... –

+0

很高兴我能帮上忙。 :) – Taro