"Распределение объектов на этапе сборки мусора" Расширение Ruby C с помощью openmp

Я создаю камень с расширением ruby ​​c, который использует openmp.

То, что я пытаюсь сделать, довольно просто, просто создайте параллель, которая будет инициализировать массив ruby ​​на каждой итерации.

Итак, мои драгоценные файлы:

Visualize_helper.c

который определяет метод iterate_over_trajectories_parallel в качестве простой параллели для инициализации ruby ​​Array.

#include <ruby.h>
#include <stdlib.h>
#include <omp.h>

static VALUE iterate_over_trajectories_parallel() {

  int i;

  #pragma omp parallel for private(i)
  for (i = 0; i < 500; i++ ){

    VALUE aggr = rb_ary_new();
  }

  return Qnil;
}

void Init_visualize_helper(void) {

  // Register the VisualizeHelper module
  VALUE mVisualizeHelper = rb_define_module("VisualizeHelper");

  // Register the method that iterates on each trajectory using openmp
  rb_define_singleton_method(mVisualizeHelper, "iterate_over_trajectories_parallel",                                  iterate_over_trajectories_parallel, 0);
}  

extconf.rb

require "mkmf"
extension_name = "visualize_helper"
dir_config("visualize_helper")
$CXXFLAGS += ' -fopenmp '
$CFLAGS += ' -fopenmp '
have_library('gomp', "main")
create_makefile "visualize_helper/visualize_helper"

Проблема в том, что в зависимости от размера итерации все работает нормально (размер итерации <~ 100) или отчет о сбое каждый раз с различной ошибкой. Некоторые из ошибок, которые появляются:

ошибка 1

-- Crash Report log information --------------------------------------------
See Crash Report log file under the one of following:
 * ~/Library/Logs/CrashReporter
 * /Library/Logs/CrashReporter
 * ~/Library/Logs/DiagnosticReports
 * /Library/Logs/DiagnosticReports
for more details.

-- Control frame information -----------------------------------------------
ruby(19787,0x700000088000) malloc: *** error for object 0x7f80c37dd310: double free
*** set a breakpoint in malloc_error_break to debug
c:0031 p:---- s:0121 e:000120 CFUNC  :iterate_over_trajectories_parallel
c:0030 p:0013 s:0118 e:000117 BLOCK  /Users/rapha/projetos/visualize_helper/spec/visualize_helper/visualize_helper_spec.rb:116 [FINISH]
c:0029 p:---- s:0116 e:000115 CFUNC  :instance_exec
c:0028 p:0021 s:0112 /Users/rapha/.rvm/rubies/ruby-2.1.5/bin/ruby -I/Users/rapha/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.4.4/lib:/Users/rapha/.rvm/gems/ruby-2.1.5/gems/rspec-support-3.4.1/lib /Users/rapha/.rvm/gems/ruby-2.1.5/gems/rspec-core-3.4.4/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb failed

Ошибка 2

[BUG] object allocation during garbage collection phase
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]

-- Crash Report log information --------------------------------------------
  See Crash Report log file under the one of following:
 * ~/Library/Logs/CrashReporter
 * /Library/Logs/CrashReporter2
 * ~/Library/Logs/DiagnosticReports
 * /Library/Logs/DiagnosticReports
 for more details.

Я считаю, что источником проблемы на самом деле является ошибка 2: размещение объектов на этапе сбора мусора

Но я не знаю, как это исправить, есть идеи на этот счет?

Спасибо за Ваше внимание.

0 ответов

Другие вопросы по тегам