[英]printing from cuda kernels
我正在編寫一個 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 中編程。感謝您的所有幫助。
要在 Compute Capability >= 2.0 的設備上啟用普通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
,在頂部窗口中鍵入compute_20,sm_20
,單擊 OK。
您可以編寫此代碼以從 CUDA 內核中打印您想要的任何內容:
# if __CUDA_ARCH__>=200
printf("%d \n", tid);
#endif
並包含 <stdio.h>
解決此問題的一種方法是使用能夠從內核打印的 cuPrintf 函數。 從文件夾中復制文件cuPrintf.cu
和cuPrintf.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
功能,那么如果有人可以向我展示這將非常有幫助。 感謝大家的合作
我在帶有GeForce GTX 1060的Visual Studio 2015上有cuda v10.0.130,而我所要做的就是添加以下include語句:
#include <helper_cuda.h>
然后我能夠毫無問題地使用printf語句。
我正在使用 GTX 1650、GTX1050 和 c++11。 對於最近的用戶,這是我的建議:
在主機功能中:
#include<iostream>
using namespace std;
cout<< .....(anything you want) << endl;
在內核中:
if(threadIdx.x==0){
printf("ss=%4.2f \n", ss);
}
請注意,這個“如果”非常重要,我注意到沒有人提到這一點。 因為您可能會使用很多線程,並且您絕對不想從每個線程中打印太多。 4.2f 表示 4 點,2 表示小數。 這可以防止打印過多的 00000。也不要忘記 \n 跳線。
您也可以考慮這樣打印共享內存值:
if(threadIdx.x==0){
for(int i=0;i<64;i++){
for(int j=0;j<8; j++){
printf("%4.2f ", ashare[i*8+j]);
}
printf("\n");
}
printf("\n");
}
這可以漂亮地打印共享內存。 注意也需要限制只在threadIdx.x==0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.