2016-03-25 11 views
0

Ich habe ein seltsames Ergebnis durch die Ausführung eines Hello_world-Kernels, der einfach einen über die Befehlswarteschlange übergebenen Puffer ausgibt. Ich bekomme zwei verschiedene Ergebnisse von verschiedenen Geräten auf der gleichen Plattform. Siehe den Boden der Konsolenausgabe unter:OpenCL - Unterschiedliche Kernel "printf()" Ergebnisse auf verschiedenen Geräten?

Hier ist mein Kernel-Code:

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

und hier ist mein Funktionsaufruf:

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; 
    } 

Und meine Konsole Ausgabe:

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! 

Weiß jemand, warum die AMD-GPU "(Null)" zwischen den Zeichen einfügt, während die Intel-CPU nicht? Ist das für AMDs OpenCL-Implementierung normal?

+0

Sie nicht kopieren und „Hallo Welt“ von einem Browser-Fenster zu dieser Zeile Sie haben einfügen? Wenn ja, können Sie versuchen, sich selbst zu schreiben? –

+0

Nein, ich habe es selbst in Vim geschrieben. Was komisch ist, ist, dass es genau der gleiche OCL-Kernel ist, der auf jedem Gerät ausgeführt wird, aber die Druckausgabe ist anders. –

Antwort