2016-03-25 31 views
0

我从运行hello_world内核获得了一个奇怪的结果,该内核只打印通过命令队列传递的缓冲区。我在同一个平台上得到了来自不同设备的两个不同结果。请参阅下面的控制台输出的底部:OpenCL - 在不同的设备上有不同的内核“printf()”结果?

这里是我的内核代码:

__kernel void hello_world (__global char* message, int messageSize) { 
    for (int i =0; i < messageSize; i++) { 
     printf("%c", message[i]); 
    } 
} 

,这里是我的函数调用:

std::string message = "Hello World!"; 
    int messageSize = message.length(); 
    std::cout << "   ---> Creating Buffer... "; 
    cl::Buffer buffer(CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(char) * messageSize, (char*)message.c_str()); 

    kernel.setArg(0,buffer); 
    kernel.setArg(1,sizeof(int),&messageSize); 
    std::cout << "Done!" << std::endl; 

    for (cl_uint i = 0; i<m_deviceCount[m_currentPlatform]; i++) { 
     std::cout << "   ---> Queuing Kernel Task on Device #"<< m_currentPlatform << "." << i << "... "; 
     m_commandQueues[i].enqueueTask(kernel); 
     std::cout << "Done!" << std::endl; 
     std::cout << "   ---> Executing... Output:\n\n"; 
     m_commandQueues[i].finish(); 
     std::cout << "\n\n   ---> Done!" << std::endl; 
    } 

我的控制台输出:

Found 1 Platforms 

Platform #0: 
    Name: AMD Accelerated Parallel Processing 
    Found 2 Devices 
     Device #0.0: 
      --> Name:    Juniper 
      --> Vendor:    Advanced Micro Devices, Inc. 
      --> Max Compute Units: 10 
      --> Max Clock Freq:  850 
      --> Global Mem Size: 512 MBs 
      --> Local Mem Size:  32 KBs 
      --> Hardware Version: OpenCL 1.2 AMD-APP (1800.11) 
      --> Software Version: 1800.11 
      --> Open CL Version: OpenCL C 1.2 
      --> Images Supported: YES 
     Device #0.1: 
      --> Name:    Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz 
      --> Vendor:    GenuineIntel 
      --> Max Compute Units: 8 
      --> Max Clock Freq:  3796 
      --> Global Mem Size: 15905 MBs 
      --> Local Mem Size:  32 KBs 
      --> Hardware Version: OpenCL 1.2 AMD-APP (1800.11) 
      --> Software Version: 1800.11 (sse2,avx) 
      --> Open CL Version: OpenCL C 1.2 
      --> Images Supported: YES 

    Using Platform With Most Available Devices: Platform #0 
      ---> Creating Context.... Done! 
      ---> Creating Command Queue for Device #0.0.... Done! 
      ---> Creating Command Queue for Device #0.1.... Done! 
      ---> Loading Program: hello_world.cl... 
        > Compiling... Done! 
      ---> Creating Buffer... Done! 

      ---> Queuing Kernel Task on Device #0.0... Done! 
      ---> Executing... Output: 

H(null)e(null)l(null)l(null)o(null) (null)W(null)o(null)r(null)l(null)d(null)!(null) 

      ---> Done! 
      ---> Queuing Kernel Task on Device #0.1... Done! 
      ---> Executing... Output: 

Hello World! 

      ---> Done! 

有谁知道为什么AMD GPU插入“(空)”字符之间,而英特尔CPU不是? AMD对OpenCL的实施是否正常?

+0

你没有复制粘贴的“Hello World”,从一些浏览器窗口,该行是吗?如果是的话,你可以尝试自己写作吗? –

+0

不,我自己写在Vim中。奇怪的是,它与每个设备上运行的OCL内核完全相同,但打印输出不同。 –

回答

相关问题