Example #1
0
static size_t
reg_size (enum m32c_sim_reg regno)
{
  switch (regno)
    {
    case m32c_sim_reg_r0_bank0:
    case m32c_sim_reg_r1_bank0:
    case m32c_sim_reg_r2_bank0:
    case m32c_sim_reg_r3_bank0:
    case m32c_sim_reg_r0_bank1:
    case m32c_sim_reg_r1_bank1:
    case m32c_sim_reg_r2_bank1:
    case m32c_sim_reg_r3_bank1:
    case m32c_sim_reg_flg:
    case m32c_sim_reg_svf:
      return 2;

    case m32c_sim_reg_a0_bank0:
    case m32c_sim_reg_a1_bank0:
    case m32c_sim_reg_fb_bank0:
    case m32c_sim_reg_sb_bank0:
    case m32c_sim_reg_a0_bank1:
    case m32c_sim_reg_a1_bank1:
    case m32c_sim_reg_fb_bank1:
    case m32c_sim_reg_sb_bank1:
    case m32c_sim_reg_usp:
    case m32c_sim_reg_isp:
      return mask_size (addr_mask);

    case m32c_sim_reg_pc:
    case m32c_sim_reg_intb:
    case m32c_sim_reg_svp:
    case m32c_sim_reg_vct:
      return mask_size (membus_mask);

    case m32c_sim_reg_dmd0:
    case m32c_sim_reg_dmd1:
      return 1;

    case m32c_sim_reg_dct0:
    case m32c_sim_reg_dct1:
    case m32c_sim_reg_drc0:
    case m32c_sim_reg_drc1:
      return 2;

    case m32c_sim_reg_dma0:
    case m32c_sim_reg_dma1:
    case m32c_sim_reg_dsa0:
    case m32c_sim_reg_dsa1:
    case m32c_sim_reg_dra0:
    case m32c_sim_reg_dra1:
      return 3;

    default:
      fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
	       regno);
      return -1;
    }
}
Example #2
0
void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max)
{
	size_t size_cpus, size_mask;
	bool is_dummy = cpu_map__empty(map);

	/*
	 * Both array and mask data have variable size based
	 * on the number of cpus and their actual values.
	 * The size of the 'struct cpu_map_data' is:
	 *
	 *   array = size of 'struct cpu_map_entries' +
	 *           number of cpus * sizeof(u64)
	 *
	 *   mask  = size of 'struct cpu_map_mask' +
	 *           maximum cpu bit converted to size of longs
	 *
	 * and finaly + the size of 'struct cpu_map_data'.
	 */
	size_cpus = cpus_size(map);
	size_mask = mask_size(map, max);

	if (is_dummy || (size_cpus < size_mask)) {
		*size += size_cpus;
		*type  = PERF_CPU_MAP__CPUS;
	} else {
		*size += size_mask;
		*type  = PERF_CPU_MAP__MASK;
	}

	*size += sizeof(struct cpu_map_data);
	return zalloc(*size);
}
Example #3
0
void OopMapCacheEntry::deallocate_bit_mask() {
  if (mask_size() > small_mask_limit && _bit_mask[0] != 0) {
    assert(!Thread::current()->resource_area()->contains((void*)_bit_mask[0]),
      "This bit mask should not be in the resource area");
    FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0]);
    debug_only(_bit_mask[0] = 0;)
  }
Example #4
0
void OopMapCacheEntry::allocate_bit_mask() {
  if (mask_size() > small_mask_limit) {
    assert(_bit_mask[0] == 0, "bit mask should be new or just flushed");
    _bit_mask[0] = (intptr_t)
      NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size());
  }
}
Example #5
0
InterpreterOopMap::~InterpreterOopMap() {
  // The expection is that the bit mask was allocated
  // last in this resource area.  That would make the free of the
  // bit_mask effective (see how FREE_RESOURCE_ARRAY does a free).
  // If it was not allocated last, there is not a correctness problem
  // but the space for the bit_mask is not freed.
  assert(_resource_allocate_bit_mask, "Trying to free C heap space");
  if (mask_size() > small_mask_limit) {
    FREE_RESOURCE_ARRAY(uintptr_t, _bit_mask[0], mask_word_size());
  }
}
DriftingGratingStimulus::DriftingGratingStimulus(const ParameterValueMap &parameters) :
    StandardDynamicStimulus(parameters),
    xoffset(registerVariable(parameters[BasicTransformStimulus::X_POSITION])),
    yoffset(registerVariable(parameters[BasicTransformStimulus::Y_POSITION])),
    width(registerVariable(parameters[BasicTransformStimulus::X_SIZE])),
    height(registerVariable(parameters[BasicTransformStimulus::Y_SIZE])),
    rotation(registerVariable(parameters[BasicTransformStimulus::ROTATION])),
    alpha_multiplier(registerVariable(parameters[BasicTransformStimulus::ALPHA_MULTIPLIER])),
    spatial_frequency(registerVariable(parameters[FREQUENCY])),
    speed(registerVariable(parameters[SPEED])),
    starting_phase(registerVariable(parameters[STARTING_PHASE])),
    direction_in_degrees(registerVariable(parameters[DIRECTION]))
{
    const std::string &grating_type = parameters[GRATING_TYPE].str();
    shared_ptr<Variable> grating_sample_rate(parameters[GRATING_SAMPLE_RATE]);

	if (grating_type == "sinusoid") {
		grating = shared_ptr<SinusoidGratingData>(new SinusoidGratingData(grating_sample_rate));
	} else if (grating_type == "square") {
		grating = shared_ptr<SquareGratingData>(new SquareGratingData(grating_sample_rate));
	} else if (grating_type == "triangle") {
		grating = shared_ptr<TriangleGratingData>(new TriangleGratingData(grating_sample_rate));
	} else if (grating_type == "sawtooth") {
		grating = shared_ptr<SawtoothGratingData>(new SawtoothGratingData(grating_sample_rate, parameters[INVERTED]));
	} else {
		throw SimpleException("illegal grating type", grating_type);		
	}

    const std::string &mask_type = parameters[MASK].str();
	shared_ptr<Variable> mask_size(new ConstantVariable(128L));

	if (mask_type == "rectangle") {
		mask = shared_ptr<Mask>(new RectangleMask(mask_size));
	} else if (mask_type == "ellipse") {
		mask = shared_ptr<Mask>(new EllipseMask(mask_size));
	} else if (mask_type == "gaussian") {
		mask = shared_ptr<Mask>(new GaussianMask(mask_size, parameters[MEAN], parameters[STD_DEV]));
	} else {
		throw SimpleException("illegal mask", mask_type);				
	}
}
Example #7
0
	  if (old_dtype != dtype || old_wsize != wsize) {
	    printf("Changing '%s' to data type %s, word size %d (msb at %d)\n",
		   sval, dtype == DATA_UNSIGNED ? "unsigned" : "int", wsize, msone);
	  }
#endif
	  ok = 1;
	}
      }
      if (!ok) {
	yyserror("Number too large for data type: '%s'", sval);
      }
    }
  }
  result->wsize = wsize;
  result->val = dtype == DATA_FLOAT ? float_const(fval) :
    mask_size(dtype == DATA_UNSIGNED ? uint_const(val) : int_const(val), wsize, dtype);
  result->dtype = dtype;
  return result;
}

/******************************************** Output Display *****************************************/

/* 100 spaces */
static char *fill_buf = 
"                                                                                                    ";
static int fill_pos = 0;
static int max_pos = 99;
static char *fill_string = "";

void reset_pos() {
  fill_pos = max_pos;
        void on_start_thread(std::size_t num_thread)
        {
            if (nullptr == queues_[num_thread])
            {
                queues_[num_thread] =
                    new thread_queue_type(max_queue_thread_count_);

                if (num_thread < high_priority_queues_.size())
                {
                    high_priority_queues_[num_thread] =
                        new thread_queue_type(max_queue_thread_count_);
                }
            }

            // forward this call to all queues etc.
            if (num_thread < high_priority_queues_.size())
                high_priority_queues_[num_thread]->on_start_thread(num_thread);
            if (num_thread == queues_.size()-1)
                low_priority_queue_.on_start_thread(num_thread);

            queues_[num_thread]->on_start_thread(num_thread);

            std::size_t num_threads = queues_.size();
            // get numa domain masks of all queues...
            std::vector<mask_type> numa_masks(num_threads);
            std::vector<mask_type> core_masks(num_threads);
            for (std::size_t i = 0; i != num_threads; ++i)
            {
                std::size_t num_pu = get_pu_num(i);
                numa_masks[i] =
                    topology_.get_numa_node_affinity_mask(num_pu, numa_sensitive_ != 0);
                core_masks[i] =
                    topology_.get_core_affinity_mask(num_pu, numa_sensitive_ != 0);
            }

            // iterate over the number of threads again to determine where to
            // steal from
            std::ptrdiff_t radius =
                static_cast<std::ptrdiff_t>((num_threads / 2.0) + 0.5);
            victim_threads_[num_thread].reserve(num_threads);
            std::size_t num_pu = get_pu_num(num_thread);
            mask_cref_type pu_mask =
                topology_.get_thread_affinity_mask(num_pu, numa_sensitive_ != 0);
            mask_cref_type numa_mask = numa_masks[num_thread];
            mask_cref_type core_mask = core_masks[num_thread];

            // we allow the thread on the boundary of the NUMA domain to steal
            mask_type first_mask = mask_type();
            resize(first_mask, mask_size(pu_mask));

            std::size_t first = find_first(numa_mask);
            if (first != std::size_t(-1))
                set(first_mask, first);
            else
                first_mask = pu_mask;

            auto iterate = [&](hpx::util::function_nonser<bool(std::size_t)> f)
            {
                // check our neighbors in a radial fashion (left and right
                // alternating, increasing distance each iteration)
                int i = 1;
                for (/**/; i < radius; ++i)
                {
                    std::ptrdiff_t left =
                        (static_cast<std::ptrdiff_t>(num_thread) - i) %
                            static_cast<std::ptrdiff_t>(num_threads);
                    if (left < 0)
                        left = num_threads + left;

                    if (f(std::size_t(left)))
                    {
                        victim_threads_[num_thread].push_back(
                            static_cast<std::size_t>(left));
                    }

                    std::size_t right = (num_thread + i) % num_threads;
                    if (f(right))
                    {
                        victim_threads_[num_thread].push_back(right);
                    }
                }
                if ((num_threads % 2) == 0)
                {
                    std::size_t right = (num_thread + i) % num_threads;
                    if (f(right))
                    {
                        victim_threads_[num_thread].push_back(right);
                    }
                }
            };

            // check for threads which share the same core...
            iterate(
                [&](std::size_t other_num_thread)
                {
                    return any(core_mask & core_masks[other_num_thread]);
                }
            );

            // check for threads which share the same numa domain...
            iterate(
                [&](std::size_t other_num_thread)
                {
                    return
                        !any(core_mask & core_masks[other_num_thread])
                        && any(numa_mask & numa_masks[other_num_thread]);
                }
            );

            // check for the rest and if we are numa aware
            if (numa_sensitive_ != 2 && any(first_mask & pu_mask))
            {
                iterate(
                    [&](std::size_t other_num_thread)
                    {
                        return !any(numa_mask & numa_masks[other_num_thread]);
                    }
                );
            }
        }
template <typename MatElem> cv::Mat _generateGaussianMask(const cv::Mat& covariance, double ignore_rate){
	assert(skl::checkMat(covariance,-1,1,cv::Size(2,2)));

	cv::Mat Wvec,U,Vt;
	cv::SVD svd;
	svd.compute(covariance,Wvec,U,Vt);
	cv::Mat W(covariance.size(),covariance.type());

	std::vector<MatElem> std_dev(W.rows);
	for(int i=0;i<W.rows;i++){
		std_dev[i] = (MatElem)std::sqrt((double)Wvec.at<MatElem>(i,0));
	}

	// mask size must be odd num
	cv::Point center(
		static_cast<int>(std_dev[0] * ignore_rate/2),
		static_cast<int>(std_dev[1] * ignore_rate/2));

	cv::Size mask_size(
			center.x*2+1,
			center.y*2+1);
	cv::Mat gaussian_x = cv::getGaussianKernel(mask_size.width ,-1, covariance.depth());
	cv::Mat gaussian_y = cv::getGaussianKernel(mask_size.height,-1, covariance.depth());

	cv::Mat gaussian_mask = gaussian_y * gaussian_x.t();


/*	for(int i=0;i<Wvec.rows;i++){
		W.at<MatElem>(i,i) = Wvec.at<MatElem>(i,0);
	}

	std::cout << "covariance >> " << covariance << std::endl;
	std::cout << "W >> " << W << std::endl;
	std::cout << "U >> " << U << std::endl;
	std::cout << "Vt >> " << Vt << std::endl;
	std::cout << (U*W*Vt) << std::endl;
*/


	float rad = skl::radian(cv::Point2f(U.at<MatElem>(0,0),U.at<MatElem>(0,1)));
	float degree = rad*180/CV_PI;
//	std::cout << "gausiann rotation: " << degree << std::endl;

/*
	// DEBUG CODE: draw vertical/horizontal lines crossing at the center.
	for(int x=0;x<gaussian_mask.cols;x++){
		gaussian_mask.at<MatElem>(center.y,x) = 1;
	}
	for(int y=0;y<gaussian_mask.rows;y++){
		gaussian_mask.at<MatElem>(y,center.x) = 1;
	}
*/
	// rotate gaussian mask
	int max_length = std::max(mask_size.width,mask_size.height);
	cv::Size dist_size(max_length,max_length);
	cv::Mat gaussian_mask_max_length(dist_size,gaussian_mask.type(),cv::Scalar(0));
	int diff_x = max_length - mask_size.width;
	int diff_y = max_length - mask_size.height;
	gaussian_mask.copyTo(
			cv::Mat(
				gaussian_mask_max_length,
				cv::Rect(diff_x/2,diff_y/2,mask_size.width,mask_size.height)
				)
			);

	cv::Mat affin_mat = cv::getRotationMatrix2D(cv::Point(max_length/2,max_length/2),degree,1.0);

//	std::cout << affin_mat << std::endl;

	cv::Mat gaussian_mask_rotated;

/*
	cv::namedWindow("before rotation",0);
	cv::imshow("before rotation",gaussian_mask_max_length);
*/
	cv::warpAffine(gaussian_mask_max_length,gaussian_mask_rotated,affin_mat,dist_size);
	return gaussian_mask_rotated;
}