簡體   English   中英

在OpenCL clCreateContext中從void(*)(...)到void(*)(...)的轉換無效

[英]Invalid conversion from void (*) (…) to void (*) (…) in OpenCL clCreateContext

我正在邁出C ++和OpenCL的第一步來執行並行計算,但是我遇到了一個試圖將監聽器函數傳遞給clCreateContext的錯誤。 我的程序(未顯示)崩潰沒有錯誤,所以我需要添加一個函數來將OpenCL錯誤轉發給stdout / stderr。 clCreateContext函數有一個函數指針的參數,可以設置為將錯誤消息轉發給stdout或stderr。 我使用Codeblocks / MinGW得到編譯時錯誤:

invalid conversion from 'void (*)(const char*, const void*, size_t, void*)' to 
'void (*)(const char*, const void*, size_t, void*)'

我在下面的代碼中復制了這個問題:

#include <stdlib.h>
#include <stdio.h>
#include <CL\cl.h>

void pfn_notify(const char *errinfo, const void *private_info, size_t cb, void *user_data)
{
    fprintf(stderr, "OpenCL Error (via pfn_notify): %s\n", errinfo);
}

int main()
{
    /*Get platform and device info*/
    cl_platform_id platform_id = NULL;
    cl_uint ret_num_platforms;
    cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
    cl_device_id device_id = NULL;
    cl_uint ret_num_devices;
    ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices);

    /*Create openCL context*/
    cl_context context = clCreateContext(NULL, 1, &device_id, &pfn_notify, NULL, &ret);

     /*Some line after this throws an error*/
}

我已經看到使用這個確切方法的代碼示例和pfn_notify已經有效,並且我不確定為什么我的程序甚至沒有編譯。 在此先感謝,並告訴我是否還有其他任何我可以發布的幫助。

你需要將你的函數聲明為

void CL_CALLBACK pfn_notify(.....

正如評論員指出的那樣; 如果此代碼在C ++文件中,那么它還需要:

extern "C" void CL_CALLBACK pfn_notify(.....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM