2012-05-02 46 views
0

有人能告訴我OpenLAB版本的cudaMemcpyToSymbol用於將__constant複製到設備並返回主機?
或通常的clenquewritebuffer(...)會完成這項工作嗎?
在論壇中找不到太多幫助。其實幾行演示就足夠了。OpenCL版本的cudaMemcpyToSymbol&優化

我還希望opencl中的優化與使用常量緩存的CUDA相同嗎?

感謝

回答

0

不確定OpenCL.Net,但在普通的OpenCL:是的,clenquewritebuffer足夠(只記得與CL_MEM_READ_ONLY標誌集創建緩衝區)。

下面是從Nvidia GPU Computing SDK(的OpenCL/SRC/oclQuasirandomGenerator/oclQuasirandomGenerator.cpp)演示:

c_Table[i] = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int),  
       NULL, &ciErr); 
ciErr |= clEnqueueWriteBuffer(cqCommandQueue[i], c_Table[i], CL_TRUE, 0, 
      QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int), tableCPU, 0, NULL, NULL); 

在CUDA和OpenCL中常量存儲器是完全一樣的,並提供相同類型的優化。也就是說,如果你使用nVidia GPU。在ATI GPU上,它應該採取類似的行動。我懷疑在CPU上運行時,不斷的內存會給你帶來比全局更多的好處。

+0

CPU如何處理本地和常量兌現(CPU中不存在)? – gpuguy

+0

@gpuguy OpenCL存儲器概念與底層硬件架構的實際關係沒有明確規定,AFAIK。我相信在CPU上它們只是普通RAM的一部分,並且與任何其他訪問RAM(全局,紋理等)一樣被緩存。 – aland

2

我見過有人用內存中的常量設置cudaMemcpyToSymbol(),編譯器在優化代碼時可以利用這些常量。如果要在openCL中設置一個內存緩衝區以將這些常量傳遞給內核,那麼編譯器不能使用它們來優化代碼。

取而代之的是我找到的解決方案是用打印替換爲cudaMemcpyToSymbol(),該字符串定義了編譯器的符號。編譯器可以採用-D FOO=bar的形式定義符號FOO爲值bar