2015-01-31 32 views
-1

在前幾天printf不受支持,我們要麼使用仿真程序運行CUDA程序,要麼會在主機端來回複製變量並進行打印。printf如何在CUDA計算上工作> = 2

既然CUDA(arch 2及更高版本)支持printf我很想知道這是如何工作的?我的意思是如何在屏幕上顯示GPU printf?計算能力1的限制因素是什麼?

+3

就我所知,'printf()'需要一個ABI。沒有針對sm_1x設備的ABI,其中一個原因可能是設備上缺少通用指針的平坦地址空間(sm_1x僅支持共享,全局,常量等地址空間的特定於地址空間的指針)。當前的設備端'printf()'輸出到GPU全局內存中的環形緩衝區,其內容在內核完成時被傳送到主機。環緩衝區顯然可以溢出;據我所知,尺寸是用戶可配置的,請查看編程指南。 – njuffa 2015-01-31 22:57:06

+1

您可以使用'cudaDeviceSetLimit(cudaLimitPrintfFifoSize,sizeInBytes)'來設置設備大小爲'printf()'的環形緩衝區的大小。請參閱[CUDA運行時API文檔](http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gb8a22e29cc297634b0702db0b69f59e7) – njuffa 2015-01-31 23:06:30

+1

設備端'printf()'的操作將在一定程度上進行描述在[B.17節。 CUDA C編程指南](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output) – njuffa 2015-01-31 23:16:03

回答

2

CUDA C Programming Guide

從內核到主機側輸出流格式化輸出的printf打印。

在內核啓動之前,printf()的輸出緩衝區設置爲固定大小(請參閱關聯的主機端API)。它是循環的,如果在內核執行過程中產生的輸出比在緩衝區中更多,那麼舊的輸出將被覆蓋。當進行這些動作之一,它僅僅刷新:

...

內部的printf()使用一個共享的數據結構,所以它可能調用的printf()可能會改變線程的執行順序。特別是,調用printf()的線程可能比不調用printf()的線程執行時間更長,並且該路徑長度取決於printf()的參數。但是,請注意,CUDA不保證線程執行順序,除非明確的__syncthreads()障礙,所以無法判斷執行順序是否已由printf()修改或通過硬件中的其他調度行爲。

以下API函數獲取和設置用於將printf()的參數和內部元數據傳送到主機的緩衝區的大小(默認爲1兆字節):

  • cudaDeviceGetLimit(size_t* size,cudaLimitPrintfFifoSize)
  • cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size_t size)