2011-06-19 39 views
0

我有這樣的事情之一:CUDA中全局變量的字符串查找錯誤?

  • __constant__ double PNT[ NUMCOORDS ];
  • __device__ double PNT[ NUMCOORDS ];

取決於一些預處理選擇。然後我用這個變量:

cudaMemcpyToSymbol("PNT", point, pntSize)

然而,有時(我時真的混淆了我真的不能說)我得到錯誤信息:

重複的全局變量看up by字符串名稱

檢查CUDA錯誤時。我試着用PNT更換"PNT"和奇怪的是,這個工程:

cudaMemcpyToSymbol(PNT, point, pntSize)

Shound我在實踐中(而不是使用字符串"PNT")使用此解決方案?

+0

如果沒有更詳細的例子,我想很難說出發生了什麼,最好是以其他人可以複製的形式。你是否用不同的宏設置分析你的文件幾次?也許nvcc不更新一些中間文件,並且它最終同時具有__constant__和__device__變量? – CygnusX1

+0

已經感謝了;只是簡短的問題:代碼'cudaMemcpyToSymbol(PNT,point,pntSize)'100%正確嗎?如果是這樣,我會堅持下去,因爲使用它時不會出現任何錯誤! – tim

+0

[CUDA庫文檔](http://developer.download.nvidia.com/compute/cuda/3_1/toolkit/docs/online/group__CUDART__MEMORY_g58acd070e6f9bb82d7aeee3d0b958460.html)表明您嘗試做的事是正確的。您可能需要將另外2個參數傳遞給該函數。但是,我會小心的,如果nvcc弄亂了變量,它可能實際上也會混淆在這個函數中,通過將數據複製到不正確的目的地。 – CygnusX1

回答

3

基本問題與cudaMemcpyToSymbol無關。您看到的錯誤是由CUDA運行時生成的,因爲它在您運行代碼的上下文中多次定義的情況下搜索您提供的符號。 CUDA運行時版本在檢測重複定義方面越來越好(例如__constant__聲明,紋理,__device__函數)。

解決方案是重構您的代碼,以便在應用程序中只定義一次符號。由於CUDA沒有鏈接器,因此如果您在兩個文件中定義了一個符號,則不會出現編譯時錯誤。但是,當CUDA運行時從最終鏈接的應用程序將產生的二進制負載加載到上下文中時,可能會發生重複的符號衝突,並可能導致運行時錯誤。

+0

從描述中,我認爲變量只能定義一次,其類型(常量或設備)僅取決於某個編譯標誌。 – CygnusX1

+0

是的,你是對的CygnusX1,它只被定義爲一次。 – tim