"Распределение объектов на этапе сборки мусора" Расширение 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: размещение объектов на этапе сбора мусора
Но я не знаю, как это исправить, есть идеи на этот счет?
Спасибо за Ваше внимание.