恒定记忆

时间:2013-02-06 09:16:31

标签: cuda gpu-constant-memory

我编写用于将整数复制到常量内存并在全局函数中使用它的代码,但它无法正常工作。我的意思是全局函数中没有“cuPrintf”可以工作而且没有打印!

我认为这是因为“if(* num == 5)”,因为我删除它,所有“cuPrintf”打印出我想要的东西!

我也尝试“if(num == 5)”但我的visual studio不会编译它并显示错误。

为什么“num”在“cuPrintf”中是正确的,但在“if”语句中它是不正确的?

我应该如何在“if”语句中使用“num”?

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include "stdio.h"
#include "stdlib.h"
#include "cuPrintf.cu"

__constant__ int* num;

__global__ void kernel(){
cuPrintf("\n num=%d\n",num);
if(*num == 5)
    cuPrintf("\n num is equal 5");
else
    cuPrintf("\n num is not equal 5");
}

void main(){    
int x;
printf("\n\nPlease enter x:");
scanf("%d",&x);
cudaMemcpyToSymbol( num, &x,sizeof(int)*1);

cudaPrintfInit();
kernel<<<1,1>>>();
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();

int wait;
scanf("%d",&wait);
}

如果我改变:

__constant__ int* num;

__constant__ int num;

也改变了:

cudaMemcpyToSymbol( num, &x,sizeof(int)*1);

cudaMemcpyToSymbol( &num, &x,sizeof(int)*1);

然后

cuPrintf("\n num=%d\n",num);
任何输入

都会显示“num = 0”!

1 个答案:

答案 0 :(得分:3)

“num”不应该是指针。我将您的代码更改为下面的代码,适用于我(注意它需要SM 2.0或更新版本的printf):

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include "stdio.h"
#include "stdlib.h"

__constant__ int num;

__global__ void kernel() {
    printf("\n num=%d\n", num);
    if (num == 5)
        printf("\n num is equal 5");
    else
        printf("\n num is not equal 5");
}

int main() {
    cudaError_t err;
    int x;
    printf("\n\nPlease enter x:");
    scanf("%d", &x);
    err = cudaMemcpyToSymbol(num, &x, sizeof(int) * 1);
    if (err != cudaSuccess) {
        printf("Error: %d\n", err);
        return 1;
    }

    kernel<<<1, 1>>>();
    err = cudaDeviceSynchronize();
    if (err != cudaSuccess) {
        printf("Error: %d\n", err);
        return 1;
    }
    return 0;
}