nbg

Ошибка в Teamcenter при выполнении handler

Pinned posts

 Доброго времени суток!

может кто сталкивался с подобной проблемой.

написал Handler, который в зависимости от вида извещения формирует определенной сообщение и отправляет его по внутренней почте.

при компиляции, нет ни каких ошибок. при использовании handler-а в процессе. он отрабатывает, но иногда teamcenter просто отваливается.

если использовать на 4 звенном теряется связь с сервером. нет никакой закономерности, может отвалится и на 2, и на 10 раз.

с помощью логера отследил, где все валится

 

 

 

SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task); 
logger::print_log(">> get root task\n");
if (ifail != ITK_ok || root_task == NULL_TAG) return;
logger::print_log(">> perem\n");
SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count); 
logger::print_log(">> get attacment\n"); 
SAFE_CALL(AOM_ask_value_string(*targets, "ekp7_CMType", &type_izv), ifail, type_izv);
logger::print_log(">> get type izv\n"); logger::print_log(" ekp7_CMType - %s\n", type_izv);

что то происходит в :

SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count); 

хотя выше точно такая же строчка выполнялась без проблем.

teamcenter  отваливается, с сообщением подробности в системном журнале.

в котором вижу только такие ошибки:

ERROR - 2018/11/16-13:42:22.483 UTC -  - The loginUser is null, this is unexpected at this point in the Session.
The Session State will not be updated with information from the client service request.

 

ERROR - 2018/11/16-13:42:30.431 UTC -  - 65: CFI error: -65.
ERROR - 2018/11/16-13:42:30.431 UTC -  - loginUser::initialise failed for 515007 - Teamcenter at d:\workdir\tc114w1201_64\src\core\tc\loginuser.cxx(582)

 

 ERROR 26003 ITK_internal_error: Unclassified error/exception. See system log file for possible explanation.
       ERROR515007 POM has not started.

 

которые не очень информативны для меня.

 

 

может кто сталкивался с подобной проблемой. если ошибка в коде, тогда почему хэндлер отрабатывает.

вообще в какую сторону копать? EPM_ask_attachments использую выше этого места, там все отрабатывает. Поэтому решил, получить нужные мне свойства, тогда когда она отработала без проблем.

для этого переписал , но в итоге точно такая же ошибка возникла:

SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);

хотя выше AOM_ask_value_tags выполнялось без ошибки.

в системном журнале те же сообщения:  The loginUser is null, this is unexpected at this point in the Session.

 

За раннее благодарен за любую подсказку!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts

loginUser is null  это уже следствие разорванной сессии. Обычно когда жестко сыпется модуль при выполнении зачастую ошибка бывает простой - где-то NULL попался,выход за пределы массива итп

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ID: 3   Опубликовано: (изменено)

1 час назад, lexx174 сказал:

loginUser is null  это уже следствие разорванной сессии. Обычно когда жестко сыпется модуль при выполнении зачастую ошибка бывает простой - где-то NULL попался,выход за пределы массива итп

нужно на прямую объявить:

targets = (tag_t *) MEM_realloc (targets, sizeof(tag_t) * 1);

на 1 умножаю, так как я всегда знаю, что извещение в процессе всегда одно.

Это я уже делал, но результат тот же(

Изменено пользователем nbg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

киньте весь кусок кода если возможно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ID: 5   Опубликовано: (изменено)

1 час назад, lexx174 сказал:

киньте весь кусок кода если возможно

void add_targets(string *body, tag_t task){
	int targets_count, ifail = ITK_ok;
	tag_t *targets = NULL;
	tag_t root_task = NULL_TAG;
	tag_t *atts = NULL_TAG, *CMHasImpactedItem =  NULL_TAG, *CMHasSolutionItem =  NULL_TAG;
	tag_t *EC_solution_item_rel = NULL_TAG, *CMHasProblemItem = NULL_TAG, *status = NULL_TAG;
	char *type_izv = NULL, *spb5_Oboznachenie = NULL, *item_revision_id = NULL, *object_name= NULL, *name = NULL; 
	int n_change, n_new, n_solution,n_problem, n_status;
	//****************************
	logger::print_log(">> add_targets\n");
	SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task);
	logger::print_log(">> get root task\n");
	if (ifail != ITK_ok || root_task == NULL_TAG) return;

	logger::print_log(">> perem\n");
	//*******************************************падает в этом месте
	SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count);
	logger::print_log(">> got attacment\n");
	
      SAFE_CALL(AOM_ask_value_string(*targets, "ekp7_CMType", &type_izv), ifail, type_izv);
	  logger::print_log(">> get type izv\n");
      logger::print_log(" ekp7_CMType - %s\n", type_izv);
	 
	 if (strcmp (type_izv, "01") == 0)
	 {
		 
		 logger::print_log(">> get change item\n");
		 (*body).append("<br><br><b>Изменяемые элементы:</b> <br>");
	     (*body).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");
		 SAFE_CALL(AOM_ask_value_tags(*targets, "CMHasImpactedItem", &n_change, &CMHasImpactedItem), ifail, n_change);
		 if (ifail != ITK_ok || CMHasImpactedItem == NULL) return;
		 if (n_change >0)
		 {
			 char ** change_it = (char**) malloc(n_change + 1);
			 string statusItog;
			 for (int i = 0; i < n_change; i++) {
			    
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "spb5_Oboznachenie", &spb5_Oboznachenie), ifail, spb5_Oboznachenie);
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "item_revision_id", &item_revision_id), ifail, item_revision_id);
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "object_name", &object_name), ifail, object_name);
				//get status
				SAFE_CALL(AOM_ask_value_tags(CMHasImpactedItem[i], "release_status_list", &n_status, &status), ifail, n_status);
				logger::print_log(">> get status!!!!!!!\n");
				char ** status_det = (char**) malloc(n_status + 1);
				for (int j = 0; j < n_status; j++){
					SAFE_CALL(AOM_ask_value_string(status[j], "object_string", &name), ifail, name);
					//status_det[j] = name;
					statusItog.append(name);
					statusItog.append("; ");
					logger::print_log("status - %s\n", statusItog);
				
				}
				strcat(spb5_Oboznachenie, "/");
				strcat(spb5_Oboznachenie, item_revision_id);
				strcat(spb5_Oboznachenie, "-");
                change_it[i] = strcat(spb5_Oboznachenie, object_name);
				logger::print_log(" Изменяемые элементы - %s\n", change_it[i]);
				(*body).append("<tr>");
				(*body).append("<td>");
				(*body).append(change_it[i]);
				(*body).append("</td>");
				(*body).append("<td>");
				(*body).append(statusItog);
				(*body).append("</td>");
				(*body).append("</tr>");
				
				statusItog="";
 }
		 }
		 
		 (*body).append("</table>");
		
		 MEM_free(CMHasImpactedItem);

		  logger::print_log(">> get new item\n");
		 // get new item
		  (*body).append("<br><br><b>Новые элементы:</b> <br>");
	      (*body).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");

 

Изменено пользователем nbg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у вас падает на 

EPM_ask_attachments?

И это стабильно воспроизводится?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, koner сказал:

у вас падает на 


EPM_ask_attachments?

И это стабильно воспроизводится?

 

да,

единственное EPM_ask_attachments выполняется выше для других целей. я решил раз уж там получил, заодно и получить нужные данные там. но тогда ошибка переместилась на 

SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);

на сколько понимаю, природа ошибки одна и та же. выше для другого поля AOM_ask_value_tags выполнилась без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А попробуйте этот обработчик протестировать в другом шаблоне процесса

2 минуты назад, koner сказал:

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

SAFE_CALL - это макрос

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, koner сказал:

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

SAFE_CALL точно не причем, он нужен для логирования. вполне можно без него

имеете в виду на предыдущей функции? или в принципе где то выше может быть ошибка?

а здесь уже как следствие, что выше уже что то произошло

6 минут назад, lexx174 сказал:

А попробуйте этот обработчик протестировать в другом шаблоне процесса

SAFE_CALL - это макрос

я так думаю это ничего не даст, так как я тестирую на самом простом процессе из одного этапа. до этого было на нем 2 этапа, но сейчас один удалил. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, nbg сказал:

имеете в виду на предыдущей функции? или в принципе где то выше может быть ошибка?

а здесь уже как следствие, что выше уже что то произошло

да. это очень похоже на ошибку с памятью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

koner верно подметил - эти ошибки приводящие к к разрыву сессии - зачастую ошибки связанные с памятью. И действительно ошибка может быть выше а не в этой именно функции. Проверьте выделение и освобождение памяти

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, lexx174 сказал:

koner верно подметил - эти ошибки приводящие к к разрыву сессии - зачастую ошибки связанные с памятью. И действительно ошибка может быть выше а не в этой именно функции. Проверьте выделение и освобождение памяти

я объявлял динамический массив

char ** buffer = (char**) malloc(n_signs + 1);

может быть это причиной?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 минуту назад, nbg сказал:

char ** buffer = (char**) malloc(n_signs + 1);

это ниочем.
Нужно весь код смотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 минуты назад, koner сказал:

это ниочем.
Нужно весь код смотреть.

void get_inf_about_task(tag_t task, char **current_task_name, char **comment, char **process_name, char **template_task_name,char **os_username, tag_t * epm_proposed_reviewers,  char **gr, char **description, char **type_izv, string *vstavka){
	logger::print_log(">> get_inf_about_task\n");
	int ifail = ITK_ok;

	SAFE_CALL(AOM_ask_value_string(task, "object_name", current_task_name), ifail, *current_task_name);
	

	SAFE_CALL(AOM_ask_value_string(task, "comments", comment), ifail, *comment);
	if (comment == NULL || !strcmp((*comment), "")) {
		strcpy((*comment), "(нет)");
	}
	
	tag_t job = NULL_TAG;
	SAFE_CALL(EPM_ask_job(task, &job), ifail, job);
	if (ifail == ITK_ok && job != NULL_TAG)
		SAFE_CALL(AOM_ask_value_string(job, "object_name", process_name), ifail, *process_name);

	tag_t root_task = NULL_TAG;
	//*************************************
	int att_count = -1;
	 tag_t *atts = NULL_TAG;
	 tag_t user = NULL_TAG;
	 tag_t **objects;
	 int n_signs = -1;
	 char*   user_name = NULL;
	 tag_t user_tag = NULL_TAG;
	 //************************************
	SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task);
	if (ifail == ITK_ok && root_task != NULL_TAG){
		SAFE_CALL(AOM_ask_value_string(root_task, "object_name", template_task_name), ifail, *template_task_name);
		//*******************************************************************************************************
			//Returns all the objects attached to the given task (for the given attachment type). 
	        SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &att_count, &atts), ifail, att_count);
			SAFE_CALL(AOM_ask_value_string(*atts, "object_desc", description), ifail, *description);
			SAFE_CALL(AOM_ask_value_string(*atts, "ekp7_CMType", type_izv), ifail, *type_izv);
			logger::print_log("att_count - %d\n", att_count);
			SAFE_CALL(AOM_ask_value_tags(*atts, "epm_proposed_reviewers", &n_signs, &epm_proposed_reviewers), ifail, n_signs);
			logger::print_log(" количество в списке кому рассылать n_signs - %d\n", n_signs);
			if (n_signs > 0)
			{
				char * mail =NULL; 
				char ** buffer = (char**) malloc(n_signs + 1);
				
				
				for (int i = 0; i < n_signs; i++) 
				{
					ifail = SA_ask_groupmember_user(epm_proposed_reviewers[i], &user_tag);
					if (user_tag != NULL_TAG)
						logger::print_log(">> получили пользователя из  groupmember\n");
					//get os_username			
					ifail = AOM_ask_value_string(user_tag, "os_username", os_username);
					SAFE_CALL(AOM_ask_value_string(user_tag, "os_username", os_username), ifail, *os_username);
					buffer[i] = *os_username;
					logger::print_log("*os_user - %s\n", *os_username);
				}
				
				char *t = buffer[0];
				strcat(t, TUPOLEV); 
				strcat(t, "; ");
				for (int i = 1; i < n_signs; i++) {
				   logger::print_log(">> print print print print\n");
				   strcat(buffer[i], TUPOLEV);
				   strcat(buffer[i], "; ");
				   logger::print_log("buffer[i] - %s\n", buffer[i]);
				   strcat(t, buffer[i]); 
				}
				*gr = t; 				
			}
		//****************************************************************************************************************
			//формируем тело письма
			tag_t  *CMHasImpactedItem =  NULL_TAG, *CMHasSolutionItem =  NULL_TAG;
	        tag_t *EC_solution_item_rel = NULL_TAG, *CMHasProblemItem = NULL_TAG, *status = NULL_TAG;
			char *spb5_Oboznachenie = NULL, *item_revision_id = NULL, *object_name= NULL, *name = NULL; 
			int n_change, n_new, n_solution,n_problem, n_status;

		 if (strcmp (*type_izv, "13") == 0){
	     // Уведомление об ошибке
		 logger::print_log(">> type_izv, 13\n");
		 logger::print_log(">> get problem item:\n");

		 (*vstavka).append("<br><br><b>Проблемные элементы:</b> <br>");
	     (*vstavka).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");
		 logger::print_log(">> vstavka");
		 SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);
		   logger::print_log(">> CMHasProblemItem:\n");
		  if (ifail != ITK_ok || CMHasProblemItem == NULL) return;
		 if (n_problem >0)
		 {
			 //char ** problem_it = (char**) malloc(n_problem + 1);
			 char ** problem_it = (char**) malloc(n_problem * sizeof(int));
			 //char ** problem_it = (char**) MEM_alloc(n_problem + 1);
			 string statusItog2;
			 for (int i = 0; i < n_problem; i++) {
			    
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "spb5_Oboznachenie", &spb5_Oboznachenie), ifail, spb5_Oboznachenie);
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "item_revision_id", &item_revision_id), ifail, item_revision_id);
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "object_name", &object_name), ifail, object_name);
				//get status
				SAFE_CALL(AOM_ask_value_tags(CMHasProblemItem[i], "release_status_list", &n_status, &status), ifail, n_status);
				logger::print_log(">> get status!!!!!!!\n");
				char ** status_det = (char**) malloc(n_status + 1);
				for (int j = 0; j < n_status; j++){
					SAFE_CALL(AOM_ask_value_string(status[j], "object_string", &name), ifail, name);
					//status_det[j] = name;
					statusItog2.append(name);
					statusItog2.append("; ");
					logger::print_log("status - %s\n", statusItog2);
				
				}
				strcat(spb5_Oboznachenie, "/");
				strcat(spb5_Oboznachenie, item_revision_id);
				strcat(spb5_Oboznachenie, "-");
				problem_it[i] = strcat(spb5_Oboznachenie, object_name);
					
				logger::print_log("Проблемные элементы - %s\n", problem_it[i]);

				(*vstavka).append("<tr>");
				(*vstavka).append("<td>");
				(*vstavka).append(problem_it[i]);
				(*vstavka).append("</td>");
				(*vstavka).append("<td>");
				(*vstavka).append(statusItog2);
				(*vstavka).append("</td>");
				(*vstavka).append("</tr>");

				statusItog2="";
			 }
		 }
		 (*vstavka).append("</table>");

		 MEM_free(CMHasProblemItem);
	 }
			
	


        //****************************************************************************************************************  

	}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а куда делось 

add_targets

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, koner сказал:

а куда делось 


add_targets

это уже второй вариант, чтобы 2 раза не определять цели проекта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

это видимо опять не весь код
strcpy((*comment), "(нет)");
копируете в comment, а память для него выделена?


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ID: 19   Опубликовано: (изменено)

6 минут назад, koner сказал:

это видимо опять не весь код
strcpy((*comment), "(нет)");
копируете в comment, а память для него выделена?


 

void get_inf_about_task(tag_t task, char **current_task_name, char **comment,..........
Изменено пользователем nbg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
19 минут назад, nbg сказал:

память для него выделена

    SAFE_CALL(AOM_ask_value_string(task, "comments", comment), ifail, *comment);
    if (comment == NULL || !strcmp((*comment), "")) {
        strcpy((*comment), "(нет)");
    }
тут ошибка, нельзя записывть в commen "нет". 


 

память для comment выделяет teamcenter, а вы ее должны освободить.
писать в commet както не правильно.
тогда так.
елси comment==NULL выделяйте память. если пустой то освобождайте а потом выделяйте.

1 пользователю понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, koner сказал:

    SAFE_CALL(AOM_ask_value_string(task, "comments", comment), ifail, *comment);
    if (comment == NULL || !strcmp((*comment), "")) {
        strcpy((*comment), "(нет)");
    }
тут ошибка, нельзя записывть в commen "нет". 


 

память для comment выделяет teamcenter, а вы ее должны освободить.
писать в commet както не правильно.
тогда так.
елси comment==NULL выделяйте память. если пустой то освобождайте а потом выделяйте.

это место в другой dll отрабатывает без ошибок, закоментил

if (comment == NULL || !strcmp((*comment), "")) {
        strcpy((*comment), "(нет)");
    }

но результат тот же

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

будет без ошибок если if не выполнится

 buffer = *os_username;
 char *t = buffer[0];
 strcat(t, TUPOLEV); 
тоже самое с памятью.

 

 

 

И вообще

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

везде где вы делаете AOM_ask_value_...
смотрите документаци.
если возвращает массив иили строку надо делать MEM_free.
Т.к. память выделяется тимцентром, в противном случае это видет к утечке памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 19.11.2018 в 15:29, koner сказал:

везде где вы делаете AOM_ask_value_...
смотрите документаци.
если возвращает массив иили строку надо делать MEM_free.
Т.к. память выделяется тимцентром, в противном случае это видет к утечке памяти.

Доброго времени суток!

судя по всему я что-то не вижу,

делаю MEM_free(t);где  char *t .

в этом месте вылетает....

MEM_free(buffer);
MEM_free(epm_proposed_reviewers); эти обе строчки отработали без проблем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

MEM_free это нужно, но без него вылетать не будет.
Ошибку я вам указал тут:
 

В 19.11.2018 в 15:13, koner сказал:

buffer = *os_username;
 char *t = buffer[0];
 strcat(t, TUPOLEV);

 

тимцентр вам возвращает указатель на строку с выделенной памятью,
а вы пытаетесь прилепить к ней еще строку (strcat) в итоге вылезаете за выделенную область памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, koner сказал:

MEM_free это нужно, но без него вылетать не будет.
Ошибку я вам указал тут:
 

 

тимцентр вам возвращает указатель на строку с выделенной памятью,
а вы пытаетесь прилепить к ней еще строку (strcat) в итоге вылезаете за выделенную область памяти.

Спасибо!

все исправлено!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну а результат какой после исправлено?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу



  • Сообщения

    • Tad
      По маркерным меткам на оптических линейных энкодерах. Это можно понять хотя бы из того, как выполняется гибка по ранее созданным программам - если глубина опускания балкии соответственно получаемый угол равен ожидаемому, то индексация выполнена и наоборот.  Ничего подобного я не вижу. Если вы и дальше будете подавать информацию в виде ребусов, ответы тоже будете получать в подобном виде. Это не связано с тем, проведена инициализация или нет. Ф вот гидравлика может нуждаться в настройке или ремонте.
    • Ветерок
      Это написал не я. Это пишется автоматом на форуме. Вы даже этого не понимаете. Если Вы общаетесь подобным тоном, то дальше общайтесь не со мной. На форуме много раз описывалось как развернуть цилиндр в Солиде. Вы не в состоянии найти эту информацию самостоятельно? Ни на форуме, ни в Хелпе? Или Вы не моете сделать эту деталь листовым металлом даже без развертки?
    • Bot
      Оригинал: NVIDIA Sets Six Records in AI Performance NVIDIA установила шесть новых рекордов по скорости вычислений в задачах, связанных с ИИ, с выходом первого в индустрии широкого набора бенчмарков для задач искусственного интеллекта. Получивший поддержку Google, Intel, Baidu, NVIDIA и десятков других лидеров индустрии, новый пакет MLPerf измеряет широкий спектр нагрузок в задачах глубокого обучения. Первый в индустрии пакет с объективной оценкой скорости вычислений для ИИ предназначен для таких областей, как компьютерное зрение, языковой перевод, персональные рекомендации и обучение с подкреплением. Решения NVIDIA показали наилучшую производительность в шести тестах MLPerf, охватывающих различные нагрузки и масштаб систем: от 16 GPU на узел до 640 GPU на 80 узлов. Данные шесть категорий включают классификацию изображений, сегментацию объектов, распознавание объектов, нерекуррентный перевод, рекуррентный перевод и системы рекомендаций. NVIDIA не предоставила [...] View the full article
    • Марсель
      Правильно, самоустанавливаемость солнечной шестерне (извините "плавучесть") даёт двойная зубчатая муфта. К тому же муфта снижает инерционную нагрузку от шестерни на сателлиты при работе. А где полумуфта на полуоси этого редуктора? К тому же полуось тяжёлая. Если диаметр полуоси сделать минимально возможным (увеличить податливость) и увеличить зазор в шлицах главной передачи, то самоустанавливаемость появится. Здесь венец плавающий, он через зубчатую полумуфту крепится.
    • Владислав Зоткин
      Созданный эскиз трапецевидного отверстия был выдавлен, после чего копирован вокруг оси при помощи "массива по концентрической сетке". У каждого отверстия скруглены четыре грани. Но у одного возникла указанная под номером 1 трудность. Как видно по указателям 2 и 3, соседнее скругление прошло без затруднений. Насадка фильтра.m3d
    • Владислав Зоткин
      День добрый, при создании нижней части циклона, при помощи сплайна задал направляющее кинематического выдавливания. После сего требуется вырезать внутренние полости вращением. Однако программа указывает на нарушенность топологии. cyclonebottom.m3d
    • werest
      Всем спасибо! Вариант предложен.
    • AlexKaz
      Задачка для коптеростроителей: http://www.reaa.ru/cgi-bin/yabb/YaBB.pl?num=1544734834/20#20 Дана масса груза и время в воздухе. Заказчик - реальный владелец сх-угодий. Если ребятки у него попросят 12 лямов - он ессно даст :) Но отрабатывать в случае кидалова будут 100%, с пеней, а не как выше - сделали удивлённые рожи "нэполусилося, начальниге".
    • NemetC
      А вот такая штука в твоем посте реализована? Я через нее М0 ставлю    
    • vad0000
      У Вас электросхемы есть? По ним будет понятно, как происходит индексация.