On 28/06/2021 9:56 am, Andrew Rowley wrote:
On 26/06/2021 4:50 pm, David Crayford wrote:

That's an exaggeration. C is just over 3x faster.

C

    mckoss-c830;14285;5.0;1;algorithm=wheel,faithful=yes,bits=1


The C implementations are confusing because there are various algorithm changes as well, rather than just the language change. This one uses the wheel algorithm instead of the base (original). I don't know enough math or algorithms to say what difference that makes.

I think the solution_2/sieve_1of2.c is the one that corresponds to the C++ code.

That not particularily fast either. How can Python be faster than C?

danielspaangberg_1of2;2756;5.000862;1;algorithm=base,faithful=yes,bits=1

BTW, if you want to compile any of the programs in solution_2 you will need the following header file as clock_gettime() and gettimeofday() are not implemented on z/OS.


#ifndef TIME_ZOS_H
#define TIME_ZOS_H 1
#include <stdint.h>
#include <errno.h>
#define clock_gettime(n,ts) gettimeofdayMonotonic(ts)
static inline int gettimeofdayMonotonic(struct timespec* Output) {
  // The POSIX gettimeofday() function is not available on z/OS. Therefore,
  // we will call stcke and other hardware instructions in implement equivalent.   // Note that nanoseconds alone will overflow when reaching new epoch in 2042.
  struct _t {
    uint64_t Hi;
    uint64_t Lo;
  };
  struct _t Value = {0, 0};
  uint64_t CC = 0;
  asm(" stcke %0\n"
      " ipm %1\n"
      " srlg %1,%1,28\n"
      : "=m"(Value), "+r"(CC)::);
  if (CC != 0) {
    errno = EMVSTODNOTSET;
    return CC;
  }
  uint64_t us = (Value.Hi >> 4);
  uint64_t ns = ((Value.Hi & 0x0F) << 8) + (Value.Lo >> 56);
  ns = (ns * 1000) >> 12;
  us = us - 2208988800000000;
  register uint64_t DivPair0 asm("r0"); // dividend (upper half), remainder
  DivPair0 = 0;
  register uint64_t DivPair1 asm("r1"); // dividend (lower half), quotient
  DivPair1 = us;
  uint64_t Divisor = 1000000;
  asm(" dlgr %0,%2" : "+r"(DivPair0), "+r"(DivPair1) : "r"(Divisor) :);
  Output->tv_sec = DivPair1;
  Output->tv_nsec = DivPair0 * 1000 + ns;
  return 0;
}
#endif

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to