Cuda Hello World printf即使用-arch = sm_20也无法正常工作

Pau*_*ulD 4 c++ cuda

我不认为我是Cuda的完全新手,但显然我是.

我最近将我的cuda设备升级到1.3到2.1(Geforce GT 630).我还想完全升级到Cuda toolkit 5.0.

我可以编译一般的cuda内核,但是即使设置-arch = sm_20,printf也不能工作.

码:

#include <stdio.h>
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>

__global__ void test(){

    printf("Hi Cuda World");
}

int main( int argc, char** argv )
{

    test<<<1,1>>>();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

Error   2   error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_20,compute_10\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include"  -G   --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile -arch=sm_20  -g   -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o "Debug\main.cu.obj" "d:\userstore\documents\visual studio 2010\Projects\testCuda\testCuda\main.cu"" exited with code 2.  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.0.targets  592 10  testCuda
Error   1   error : calling a __host__ function("printf") from a __global__ function("test") is not allowed d:\userstore\documents\visual studio 2010\Projects\testCuda\testCuda\main.cu    9   1   testCuda
Run Code Online (Sandbox Code Playgroud)

因为这个问题我完成了生活...已完成.请回答我在屋顶上的答案.

Tom*_*ski 20

如果你printf在内核中使用,你应该使用cudaDeviceSynchronize():

#include <stdio.h>
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>

__global__ void test(){
    printf("Hi Cuda World");
}

int main( int argc, char** argv )
{
    test<<<1,1>>>();
    cudaDeviceSynchronize();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


tal*_*ies 7

在内核中,printf仅在计算能力2或更高的硬件中受支持.因为你的项目设置,以建立双方计算能力1.0和2.1计算,NVCC编译代码多次,构建一个多架构fatbinary对象.在计算能力1.0编译周期期间,正在生成错误,因为该架构printf不支持该调用.

如果从项目中删除计算能力1.0构建目标,则错误将消失.

你也可以像这样编写内核:

__global__ void test()
{
#if __CUDA_ARCH__ >= 200
    printf("Hi Cuda World");
#endif
}
Run Code Online (Sandbox Code Playgroud)

[免责声明:用浏览器编写,永不编译,自担风险使用]

__CUDA_ARCH__在构建计算能力2.0或高目标时,符号将仅> = 200,这将允许您为计算能力1.x设备编译此代码而不会遇到语法错误.