12

我正在编写一个 cuda 程序并尝试使用 printf 函数在 cuda 内核中打印一些东西。但是当我编译程序时,我得到了一个错误

error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed


 error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include"  -G  --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile  -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MDd  " -o "Debug\test.cu.obj" "C:\Users\umdutta\Desktop\SANKHA_ALL_MATERIALS\PROGRAMMING_FOLDER\ABM_MODELLING_2D_3D\TRY_NUM_2\test_proj_test\test_proj\test_proj\test.cu"" exited with code 2.

我正在使用计算能力大于 2.0 的卡 GTX 560 ti,当我搜索了一些关于从 cuda 内核打印的信息时,我还发现我需要将编译器从 sm_10 更改为 sm_2.0 以充分利用卡片。也有人建议 cuPrintf 达到目的。我有点困惑我应该做什么以及在我的控制台屏幕上获取打印输出的最简单和最快的方法应该是什么。如果我需要将 nvcc 编译器从 1.0 更改为 2.0,我该怎么办?还有一件事我想提一下,我正在使用 Windows 7.0 并在 Visual Studio 2010 中编程。感谢您的所有帮助。

4

3 回答 3

10

您可以编写此代码以从 CUDA 内核中打印您想要的任何内容:

# if __CUDA_ARCH__>=200
    printf("%d \n", tid);

#endif  

并包含 <stdio.h>

于 2013-05-15T23:24:49.337 回答
9

要在 Compute Capability >= 2.0 的设备上使用 plain printf(),重要的是编译 CC 至少为 CC 2.0 并禁用默认值,其中包括 CC 1.0 的构建。

右键单击.cu项目中的文件,选择Properties,选择Configuration Properties| CUDA C/C++| Device. 单击Code Generation线,单击三角形,选择Edit。在 Code Generation 对话框中,取消选中,在顶部窗口中Inherit from parent or project defaults键入,单击 OK。compute_20,sm_20

于 2013-01-01T01:16:12.487 回答
6

解决此问题的一种方法是使用能够从内核打印的 cuPrintf 函数。复制文件cuPrintf.cucuPrintf.cuh从文件夹中复制

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\simplePrintf

到项目文件夹。然后将头文件添加cuPrintf.cuh到您的项目中并添加

#include "cuPrintf.cu"

到你的代码。那么你的代码应该以下面提到的格式编写:

#include "cuPrintf.cu"
__global__ void testKernel(int val)
{
  cuPrintf("Value is: %d\n", val);
}

int main()
{
  cudaPrintfInit();
  testKernel<<< 2, 3 >>>(10);
  cudaPrintfDisplay(stdout, true);
  cudaPrintfEnd();
  return 0;
}

按照上述步骤,可以从设备功能在控制台窗口上打印。虽然我以上述方式解决了我的问题,但我仍然没有printf从设备功能中使用的解决方案。如果确实并且绝对有必要将我的 nvcc 编译器从 sm_10 升级到 sm_21 以启用该printf功能,那么如果有人可以向我展示这将非常有帮助。感谢大家的合作

于 2012-12-31T23:40:45.080 回答