2015-02-13 2 views
13

Я получаю начал с OpenCL в VS с помощью этого учебника:функции OpenCL найдено устаревший Visual Studio

https://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201

У меня возникают проблемы с настройкой программы хоста. Это код до сих пор:

const char* clewErrorString(cl_int error) { 
    //stuff 
} 

int main(int argc, char **argv) { 


    cl_int errcode_ret; 
    cl_uint num_entries; 


    // Platform 

    cl_platform_id platforms; 
    cl_uint num_platforms; 
    num_entries = 1; 

    cout << "Getting platform id..." << endl; 
    errcode_ret = clGetPlatformIDs(num_entries, &platforms, &num_platforms); 
    if (errcode_ret != CL_SUCCESS) { 
     cout << "Error getting platform id: " << clewErrorString(errcode_ret) << endl; 
     exit(errcode_ret); 
    } 
    cout << "Success!" << endl; 


    // Device 

    cl_device_type device_type = CL_DEVICE_TYPE_GPU; 
    num_entries = 1; 
    cl_device_id devices; 
    cl_uint num_devices; 

    cout << "Getting device id..." << endl; 
    errcode_ret = clGetDeviceIDs(platforms, device_type, num_entries, &devices, &num_devices); 
    if (errcode_ret != CL_SUCCESS) { 
     cout << "Error getting device id: " << clewErrorString(errcode_ret) << endl; 
     exit(errcode_ret); 
    } 
    cout << "Success!" << endl; 


    // Context 

    cl_context context; 

    cout << "Creating context..." << endl; 
    context = clCreateContext(0, num_devices, &devices, NULL, NULL, &errcode_ret); 
    if (errcode_ret < 0) { 
     cout << "Error creating context: " << clewErrorString(errcode_ret) << endl; 
     exit(errcode_ret); 
    } 
    cout << "Success!" << endl; 


    // Command-queue 

    cl_command_queue queue; 

    cout << "Creating command queue..." << endl; 
    queue = clCreateCommandQueue(context, devices, 0, &errcode_ret); 
    if (errcode_ret != CL_SUCCESS) { 
     cout << "Error creating command queue: " << clewErrorString(errcode_ret) << endl; 
     exit(errcode_ret); 
    } 
    cout << "Success!" << endl; 


    return 0; 
} 

Это не компилируется, хотя: я получаю error C4996: 'clCreateCommandQueue': was declared deprecated, когда я пытаюсь скомпилировать. Я пока не понимаю весь процесс настройки, поэтому не знаю, что я что-то испортил или нет. В соответствии с хроносом функция, похоже, не считается устаревшей: https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateCommandQueue.html

Если я удалю часть очереди команд, остальное бежит без проблем. Как я могу сделать эту работу?

ответ

25

Функция clCreateCommandQueue была устарела с OpenCL 2.0 и заменена на clCreateCommandQueueWithProperties. Если вы настроили таргетинг только на устройства, поддерживающие OpenCL 2.0 (некоторые недавние процессоры Intel и AMD на момент написания), вы можете безопасно использовать эту новую функцию.

Если вам нужен код для запуска на устройствах, которые пока не поддерживают OpenCL 2.0, вы можете продолжать использовать устаревшую clCreateCommandQueue функции с помощью макросов препроцессора, что заголовки OpenCL обеспечивают, например:

#define CL_USE_DEPRECATED_OPENCL_1_2_APIS 
#include <CL/cl.h> 
+0

Yep , теперь нет проблем. Благодаря! – PEC

+3

У вас нет * есть * для использования функции. Вы получите предупреждение, потому что в будущем мы не будем добавлять новые функции к таким функциям, но это совершенно верно для использования и будет поддерживаться во время работы в обозримом будущем. Вместо того, чтобы сообщать VC++ игнорировать предупреждения об отказе, вы можете безопасно отключить их в заголовках OpenCL напрямую, используя флаги CL_USE_DEPRECATED_OPENCL_1_0_APIS (1_1, 1_2 ...). – Lee

+0

@ Lee Спасибо, я забыл про эти удобные макросы. Я обновил свой ответ соответственно. – jprice

Смежные вопросы