2016-11-18 3 views
5

Я только начал работать в opencl, и сейчас я работаю над тем, что должно быть относительно базовой программой hello_world в opencl. К сожалению, программа не выводит правильную фразу или что-либо вообще, вместо этого зависает без вывода.OpenCL HelloWorld

Любая идея о том, почему это так?

Ниже: openglsource.cpp и hello.cl

#define CL_USE_DEPRECATED_OPENCL_2_0_APIS 

#include<CL/cl.hpp> 
#include<iostream> 
#include <fstream> 

int main() 
{ 
    std::vector<cl::Platform> platforms; 
    cl::Platform::get(&platforms); 

    auto platform = platforms.front(); 
    std::vector<cl::Device> devices; 
    platform.getDevices(CL_DEVICE_TYPE_CPU, &devices); 

    auto device = devices.front(); 

    std::ifstream helloWorldFile("hello.cl"); 
    std::string src(std::istreambuf_iterator<char>(helloWorldFile), (std::istreambuf_iterator<char>())); 

    cl::Program::Sources sources(1, std::make_pair(src.c_str(), src.length() + 1)); 

    cl::Context context(device); 
    cl::Program program(context, sources); 

    auto err = program.build("-cl-std=CL1.2"); 

    char buf[16]; 
    cl::Buffer memBuf(context, CL_MEM_WRITE_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(buf)); 
    cl::Kernel kernel(program, "Hello", &err); 
    kernel.setArg(0, memBuf); 

    cl::CommandQueue queue(context, device); 
    queue.enqueueTask(kernel); 
    queue.enqueueReadBuffer(memBuf, GL_TRUE, 0, sizeof(buf), buf); 

    std::cout << "hello"; 
    std::cin.get(); 

} 

hello.cl

__kernel void HelloWorld(__global char* data) 
{ 
    data[0] = 'H'; 
    data[1] = 'E'; 
    data[2] = 'L'; 
    data[3] = 'L'; 
    data[4] = 'O'; 
    data[5] = ' '; 
    data[6] = 'W'; 
    data[7] = 'O'; 
    data[8] = 'R'; 
    data[9] = 'L'; 
    data[10] = 'D'; 
    data[11] = '!'; 
    data[12] = '\n'; 
} 
+0

Ваше название говорит 'OpenGL', но ваш вопрос, похоже, о' OpenGL'. Это верно? – Callat

+1

Предполагая, что вы хотели сказать OpenCL! Во всяком случае название было обновлено. –

+2

Да, я сделал ошибку, пытаясь указать на ошибку. В любом случае я собираюсь любить ваш вопрос, так как у меня с ним тоже много проблем. Повысьте для вас. – Callat

ответ

6

Вопрос был в

cl::Kernel kernel(program, "Hello", &err); 

должно быть

cl::Kernel kernel(program, "HelloWorld", &err); 

Строка, которая идет туда, является не просто произвольным именем, как я предполагал, это должна быть функция, которую вы хотите вызвать из указанного ядра. Имеет смысл дать понять, что ядро ​​может содержать несколько функций!

Такое простое исправление ..... Мне плохо для публикации!

+0

Ну, кто-то другой googling «opencl висит без вывода» может найти это полезным – qxz