小编Sal*_*kes的帖子

C++ 解释将 uint64 转换为 uint32

我正在尝试将 uint64_t(使用 boost chrono 高精度时钟表示从 D 日起以纳秒为单位的时间)到 uint32_t 以生成随机数生成器。

我只想要 uint64_t 的最低有效 32 位。这是我的尝试:

uint64_t ticks64 = dtn.count(); // This has the ticks in nanosec
uint64_t ticks32_manual = ticks64 & 0xFFFFFFFF;
uint32_t ticks32_auto = (uint32_t) ticks64;
mexPrintf("Periods: %llu\n", ticks64);
mexPrintf("32-bit manual truncation: %llu\n", ticks32_manual);
mexPrintf("32-bit automatic truncation: %u\n", ticks32_auto);
Run Code Online (Sandbox Code Playgroud)

我的代码的输出如下:

期间:651444791362198

32 位手动截断:1331774102

32 位自动截断:1331774102

我原以为 32 位和原始 64 位表示的最后几位数字相同,但事实并非如此。也就是说,我认为我会“失去 64 位数字的左半部分”。

谁能解释一下这里发生了什么?谢谢。

顺便说一句,我看过这个链接

c++ unsigned casting

5
推荐指数
1
解决办法
1万
查看次数

带有抽象类指针的对象的 C++ 副本

考虑这个Container类,它基本上存储了一个由unique_ptrs 个Box对象组成的向量,并且可以对它们执行一些计算。

class Container
{
  private:
    std::vector<std::unique_ptr<Box> > boxes_;
  public:
    Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxes)){}
    double TotalVolume() { /* Iterate over this->boxes_ and sum */ }
};
Run Code Online (Sandbox Code Playgroud)

这里,Box是一个抽象类,它有一个纯虚方法,例如double Box::Volume().

现在,假设我在主程序中将一个容器实例化为:

std::vector<std::unique_ptr<Box> > x;
x.push_back(std::move(std::unique_ptr<Box>(new SquareBox(1.0)));
x.push_back(std::move(std::unique_ptr<Box>(new RectangularBox(1.0, 2.0, 3.0)));
Container c(x);
Run Code Online (Sandbox Code Playgroud)

我如何制作副本c?我想要一个在 中制作底层Box对象副本的函数boxes_,但我认为使用基类很难做到这一点?

c++ abstract-class pointers copy-constructor

4
推荐指数
1
解决办法
1240
查看次数

OpenMP在子程序中没有线程

我正在Fortran中编写矩阵乘法子程序.我正在使用英特尔Fortran编译器.我写了一个简单的静态调度并行do循环.不幸的是,它只在一个线程上运行.这是代码:

      SUBROUTINE MATMULT(A,B,C,L,M,N)
      REAL*8 A,B,C
      INTEGER NCORES, CHUNK, TID
      DIMENSION A(L,N),B(L,M),C(M,N)
      PARAMETER (NCORES=8)
      CHUNK=(L/(NCORES+1))+1
      TID=0
!$OMP PARALLELDO SHARED(A,B,C,L,M,N,CHUNK) PRIVATE(I,J,K,TID)
!$OMP+DEFAULT(NONE) SCHEDULE(STATIC,CHUNK)
      DO I=1,L
         TID = OMP_GET_THREAD_NUM()
         PRINT *, "THREAD ", TID, " ON I=", I
         DO K=1,N
            DO J=1,M
               A(I,K) = A(I,K) + B(I,J)*C(J,K)
            END DO
         END DO
      END DO
!$OMP END PARALLELDO
      RETURN
      END
Run Code Online (Sandbox Code Playgroud)

注意:

  • 调用例程的主程序中没有并行指令
  • 阵列A,B,C在主程序中被串行初始化.A初始化为零
  • 我在编译期间强制执行Fortran固定源代码表单

我已确认以下内容:

  • 另一个示例程序适用于8个线程(因此没有硬件问题)
  • 我使用了-openmp编译器参数
  • OMP_GET_NUM_PROCS()和OMP_GET_MAX_THREADS()都返回0
  • 对于I的每次迭代,TID为0(不应该是这种情况)

我无法诊断我的错误.我很感激有关此的任何意见.

fortran openmp

2
推荐指数
1
解决办法
1460
查看次数