clGetPlatformIDs возвращают две платформы, но они одинаковы - PullRequest
1 голос
/ 23 января 2012

Для создания приложения opencl первым шагом является получение платформ с использованием

clGetPlatformIDs 

У меня проблема с платформами, которые возвращаются из функции, функция возвращает, что у меня есть 2 платформы, но когда я проверяюЯ обнаружил, что у меня есть одна платформа, но она дублирована!

исходный код

struct PLATFORM
{
    cl_platform_id _Platforms ;
    map <cl_platform_info , char*> _Platforms_info ;        
};

cl_int error ; 
cl_uint temp_num_platforms ;

error = clGetPlatformIDs (NULL , NULL , &temp_num_platforms );

if ( error != CL_SUCCESS )
{
    /* create error and debug function*/
    cout << " error detect platforms " << endl << endl ;
}
else
{
    cout << " we  detect " << temp_num_platforms << " platforms " << endl << endl ;

    _Platforms = std::unique_ptr < PLATFORM [] > ( new PLATFORM [temp_num_platforms] ) ;

    for ( unsigned int num_platforms = 1 ; num_platforms <= temp_num_platforms ; num_platforms++ )
    {   
        // get platforms    
        error = clGetPlatformIDs (num_platforms ,&_Platforms[num_platforms-1]._Platforms , NULL );

        if ( error != CL_SUCCESS || _Platforms[num_platforms-1]._Platforms == NULL )
        {
            cout << " error get platform "  <<  num_platforms - 1 << endl << endl;
        }
        else
        {
            cout << " OK ! we detect "<< num_platforms << " platform " << endl << endl ;
        }
    }
}

if ( _Platforms[0]._Platforms == _Platforms[1]._Platforms )
{
    cout << " we have two platforms" << endl << endl ;
}

1 Ответ

7 голосов
/ 23 января 2012

Вы не сказали много о своей платформе установки.Я предполагаю, что вы установили несколько версий OpenCL SDK от какого-либо поставщика.Это, или вы нажали ошибку.Попробуйте приведенную ниже программу, в которой указаны поставщик, название и версия всех платформ, указанных в вашей системе.Это может помочь вам лучше понять вашу проблему.

// You might need to change this header based on your install:
#include <OpenCL/cl.h>
#include <stdio.h>
#include <stdlib.h>

static void check_error(cl_int error, char* name) {
    if (error != CL_SUCCESS) {
        fprintf(stderr, "Non-successful return code %d for %s.  Exiting.\n", error, name);
        exit(1);
    }
}

int main (int argc, char const *argv[])
{
    cl_uint i;
    cl_int err;

    // Discover the number of platforms:
    cl_uint nplatforms;
    err = clGetPlatformIDs(0, NULL, &nplatforms);
    check_error(err, "clGetPlatformIds");

    // Now ask OpenCL for the platform IDs:
    cl_platform_id* platforms = (cl_platform_id*)malloc(sizeof(cl_platform_id) * nplatforms);
    err = clGetPlatformIDs(nplatforms, platforms, NULL);
    check_error(err, "clGetPlatformIds");

    // Ask OpenCL about each platform to understand the problem:
    char name[128];
    char vendor[128];
    char version[128];

    fprintf(stdout, "OpenCL reports %d platforms.\n\n", nplatforms);

    for (i = 0; i < nplatforms; i++) {
        err |= clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR, 128, vendor, NULL);
        err |= clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, 128, name, NULL);
        err |= clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, 128, version, NULL);
        check_error(err, "clGetPlatformInfo");

        fprintf(stdout, "Platform %d: %s %s %s\n", i, vendor, name, version);
    }

    free(platforms);
    return 0;
}

Если вы видите две идентичные строки с названиями поставщиков, то это ошибка.Отправьте это вашему поставщику OpenCL, и они будут вам благодарны!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...