Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
andet
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 3
1

Ошибка выделения памяти при использовании OpenMP в связке с ITK (Teamcenter API)

18.07.2014, 22:11. Просмотров 792. Ответов 3
Метки нет (Все метки)

Среда Visual Studio 2008
Отладки как таковой нет, все производится "наживую" в консоле, из-за того что программа требует для запуска определенные параметры прописанные в bat'файле, а как запустить его( bat'файл) в процессе дебага в VS2008 я не обнаружил.
http://ru.wikipedia.org/wiki/Teamcenter -ужасная система на джаве, с ужасным api, в чем суть проблемы -
1.Есть некая программа которая собирает данные из базы Teamcenter
2.Программа работает хоть и криво, но стабильно(хотя и долго)
3.Появилась надобность ускорить процесс(как вариант параллелизм)

Примечание 1: tag_t - внутренний тип itk api
Примечание 2: на картинках консоли я вывожу адреса переменных, ведь мне кажется проблема именно в них
Примечание 3: В считываемом файле лежат имя модели/ревизия вида - name/rev, они и считываются в структуру

Пример кода
C++
1
2
3
4
5
typedef struct massiv
{
char name[80];
char rev[5];
} mystruct;
-структура с именем и ревизией модели
C++
1
2
3
4
5
6
7
8
9
10
#define ITK(argument) { \
retcode = argument; \
if (retcode != ITK_ok) {\
char *errs = NULL; \
EMH_ask_error_text  (retcode, &errs); \
printf("" #argument "=%d at line %d in %s [%s]\n", \
retcode, __LINE__, __FILE__, errs); \
MEM_free(errs); \
} \
}
- поиск ошибок от ИТК
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
int  readfile( char  path[256] )
{
int retcode = ITK_ok,numread=0,nr=0,size2=0;
char *value=NULL;
long strok=1;
char rev[5],name[80];
long size=0;
int g=0;
long int iteracii=0;
long int chislo=0;
char *temp=NULL,*temp1=NULL,flnameerr[80],flnameerrstd[80],flnamemab[80],flnamem[80],flname[80];
char seps[]   = "/\t\n";
char *next_token = NULL;
mystruct *arry= (mystruct *)malloc(sizeof(mystruct));
FILE *stream;
*buff=NULL, *buffstd=NULL,*bufferr=NULL,*bufferrstd=NULL;
tc_strcpy(flname,path);
temp1 = ITK_ask_cli_argument( "-file=" );
strcat(flname,temp1);
if( fopen_s( &stream, flname, "r" ) != 0 )
{printf( "The file %s was not opened\n" ,flname);return 0;}
else
{
fseek(stream,0,SEEK_END);
size=ftell(stream);
fseek(stream,0,0);
value = (char *) malloc(sizeof(char) * (size));
numread = fread(value,sizeof(char),size*1,stream);
for(nr=numread-1;nr<size;nr++)
value[nr]=0;
fclose(stream);
temp=strtok_s(value,seps,&next_token);
while(temp!=NULL)
{
if(strok%2==1)
{
if(strlen(temp)<=3) strok++;
strcat(name,temp);*rev=NULL;}
if(strok%2==0){
strcat(rev,temp);
if ((strlen(name)>3) && (strlen(rev)<3)){
strcpy(arry[iteracii].name,name);
strcpy(arry[iteracii].rev,rev);
//askitem(name,rev);
iteracii++;
arry = (mystruct *)realloc( arry,sizeof(mystruct)*(iteracii+1));
};
if ((strlen(name)<=3) || (strlen(rev)>=3)) {strcat(bufferr,name);
strcat(bufferr,":");
strcat(bufferr,rev);
strcat(bufferr,":");
strcat(bufferr,"Error with revision\n");
}
*rev=NULL;*name=NULL;}
strok++;
*temp=NULL;
temp = strtok_s( NULL, seps, &next_token);
}}
const char *attr_names1="item_id";
const char **attr_names= &attr_names1;
tag_t found_objs1[100];
tag_t *found_objs=found_objs1;
int hits=0;
omp_set_num_threads(4);
#pragma omp parallel  for private (found_objs,hits)
for (g=0;g<10;g++) //тест до 10 элементов
{
const char *attr_values1=arry[g].name;
const char **attr_values= &attr_values1;
printf("start %s %d %d %p %p\n",arry[g].name,g,hits,&hits,&found_objs);
ITK(ITEM_find_item_revs_by_key_attributes(1, attr_names, attr_values, arry[g].rev,&hits,&found_objs));
printf(" %d hits\n\n",hits);
}
return 0;
}
- сам код функции
проблема возникает при
C++
1
omp_set_num_threads(4);
когда количество потоков =1 , все работает, масса получается и все довольны (рисунок 1 - все работает)
при текущем варианте выдается ошибка связанная с памятью вида рисунок 5 + рисунок 4 и рисунок 2(не видно ошибки но прога упала)
На рисунке 3 программа каким-то чудом отработала, но все равно ничего не нашла(не верно отработала)
C++
1
2
3
4
5
6
TCCORE_API int ITEM_find_items_by_key_attributes    (   int     num_attributes, 
        const char **   attribute_names, 
        const char **   attribute_values, 
        int *   n_items, 
        tag_t **    item_tags    
    )
- функция Itk в заголовочном файле
This function searches the database for all Items and returns a list of item tags identified by the given attribute name/value pairs. The attributes must be the unique key attributes of the item class. Currently, only "item_id" attribute should be used.
Parameters: num_attributes (I) number of attributes
attribute_names (I) Attribute Names
attribute_values (I) Attribute Values
n_items (O) Number of matching Items found
item_tags (OF) n_items Array of tags of found Items

Описание функции из мануала.
extern TCCORE_API int ITEM_find_item_revs_by_key_attributes(
int num_attributes, /**< (I) number of attributes */
const char** attribute_names, /**< (I) Attribute Names */
const char** attribute_values, /**< (I) Attribute Values */
const char* rev_id, /**< (I) Revision ID */
int* n_items, /**< (O) Number of matching Items found */
tag_t** item_tags /**< (OF) n_items Array of tags of found Items */
);


Я так понимаю что проблема с памятью(с адресацией, хотя я и выделил переменные в private раздел, у кого есть идеи?
0
Изображения
Тип файла: png 1.png (57.9 Кб, 12 просмотров)
Тип файла: png 2.png (29.5 Кб, 8 просмотров)
Тип файла: png 3.png (60.4 Кб, 9 просмотров)
Тип файла: png 4.png (37.4 Кб, 6 просмотров)
Тип файла: jpg 5.jpg (128.4 Кб, 7 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2014, 22:11
Ответы с готовыми решениями:

Утечка памяти при использовании Native API
Всем привет. Я использую внешнюю компоненту, написанную на С++. При вызове процедур и функций...

Web API 2.Ошибка при использовании OData запроса с contains
На запрос api/products?$filter=contains(ProductCode,'GDN'),получаю ошибку: &quot;The query specified in...

Ошибка памяти EAccessViolation при использовании TableView.DataController
Здравствуйте, у меня программа на Delphi 10, которая работает с базой данной на sql. При работе...

Проблема при использовании ILProtector'а в связке с другим обфускатором (для строк)
Что то тема умерла :( Не подскажете - вот проганяю программу через обфускатор, где шифрую строки,...

Ошибки СУБД: ошибка выделения памяти. Ошибка соединения с сервером 1С
Здравствуйте! Есть один сервер. На нем стоит MS SQL, 1С сервер и терминально подключаются...

3
uglyPinokkio
326 / 229 / 55
Регистрация: 30.05.2014
Сообщений: 682
19.07.2014, 05:29 2
Цитата Сообщение от andet Посмотреть сообщение
у кого есть идеи?
В описании вызываемого API есть слово thread safe?

C++
1
omp_set_num_threads(4);
Имеет смысл только если ядер в системе больше 4-х.
1
castaway
Эксперт С++
4948 / 3054 / 456
Регистрация: 10.11.2010
Сообщений: 11,149
Записей в блоге: 10
Завершенные тесты: 1
19.07.2014, 08:55 3
Определить переменную g в цикле.
66-я строка: for ( int g = 0; ...
0
andet
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 3
27.07.2014, 18:16  [ТС] 4
определение переменной g не помогло
по поводу thread safe все еще жду ответа от Siemens
тема все еще актуальная, есть у кого варианты?
0
27.07.2014, 18:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 18:16

Ошибка выделения памяти(?)
Первый перечень(Который perech) записывается нормально,а вот второй(makeperech) крашит(объявления...

Ошибка выделения памяти
Извиняюсь за то, что не умею гуглить. =) vector&lt;double&gt; v; v.resize(1000500);...

Ошибка выделения памяти
Добрый день , у меня проблема с выделением памяти 2-х мерному массиву. В общем такая конструкция....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.