小编Can*_*Bal的帖子

对齐和未对齐的内存访问?

对齐和未对齐的内存访问有什么区别?

我在TMS320C64x DSP上工作,我想使用内部函数(汇编指令的C函数),它有

ushort & _amem2(void *ptr);
ushort & _mem2(void *ptr);
Run Code Online (Sandbox Code Playgroud)

_amem22字节的对齐访问在哪里进行_mem2未对齐访问.

我什么时候应该使用哪个?

c c++ memory memory-alignment omap

18
推荐指数
4
解决办法
2万
查看次数

我的硬件上的time.h clock()坏了吗?

我尝试测量在OMAP ZOOM 3430 MDK附带的TMS32064x + DSP上执行一段代码所需的时钟周期.我看一下DSP芯片的"程序员指南",它说DSP支持clock()功能.

我做的很简单,我就是这么做的

start = clock();
for (i=0;i<100;i++){
    /* do something here */
}
stop = clock();
total = stop - start;
Run Code Online (Sandbox Code Playgroud)

然后将"start","stop"和"total"的值放入以前使用ARM处理器分配的共享内存中.然后我只是将它打印到ARM端的屏幕上.

问题是,在我第一次执行时,我总是得到相同的"总"值,然后在我的下一次运行中我总是得到0!"开始"和"停止"值与"总"值一起出现.

最奇怪的是他们似乎遵循了一点点模式!我把输出结果如下:

# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop  clock() value = 0x0000f9f9
# ./sampleapp 
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop  clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop  clock() value = 0xf9f9f9f9
Run Code Online (Sandbox Code Playgroud)

显然,clock()运行不正常,但我不确定这是因为我做错了什么,还是因为我的硬件不支持这种类型的东西.任何想法为什么会这样?

c c++ embedded clock omap

7
推荐指数
1
解决办法
1767
查看次数

Scala:在一次迭代中过滤和映射的最佳方式

我是Scala的新手,并试图找出过滤和映射集合的最佳方法.这是一个解释我的问题的玩具示例.

方法1:这非常糟糕,因为我在列表中迭代两次并在每次迭代中计算相同的值.

val N = 5
val nums = 0 until 10
val sqNumsLargerThanN = nums filter { x: Int => (x * x) > N } map { x: Int => (x * x).toString }
Run Code Online (Sandbox Code Playgroud)

方法2:这稍微好一点,但我还需要计算(x * x)两次.

val N = 5
val nums = 0 until 10
val sqNumsLargerThanN = nums collect { case x: Int if (x * x) > N => (x * x).toString }
Run Code Online (Sandbox Code Playgroud)

那么,是否可以计算这个而不重复两次收集并避免重复相同的计算?

collections dictionary scala filter collect

7
推荐指数
3
解决办法
1860
查看次数

如何使用DSP加速OMAP上的代码?

我正在为OMAP3430开发视频编解码器.我已经有用C++编写的代码,我尝试修改/移植它的某些部分以利用DSP(SDK(OMAP ZOOM3430 SDK)我有一个额外的DSP).

我尝试移植一个小的for循环,它运行的是非常少量的数据(~250字节),但是在不同的数据上大约需要2M次.但CPU和DSP之间通信的过载远远超过增益(如果我有的话).

我认为这个任务就像在普通计算机中优化GPU的代码一样.我的问题是移植什么样的部件会有益?GPU程序员如何处理这些任务?

编辑:

  1. GPP应用程序分配大小为0x1000字节的缓冲区.
  2. GPP应用程序调用DSPProcessor_ReserveMemory为每个分配的缓冲区保留DSP虚拟地址空间,使用比分配的缓冲区大4K的大小来考虑自动页面对齐.总预留大小也必须沿4K页面边界对齐.
  3. GPP应用程序调用DSPProcessor_Map将每个分配的缓冲区映射到上一步中保留的DSP虚拟地址空间.
  4. GPP应用程序准备一条消息,通知DSP执行阶段虚拟地址空间的基地址,该地址已映射到GPP上分配的缓冲区.GPP应用程序使用DSPNode_PutMessage将消息发送到DSP.
  5. GPP调用memcpy将要处理的数据复制到共享内存中.
  6. GPP应用程序调用DSPProcessor_FlushMemory以确保已刷新数据高速缓存.
  7. GPP应用程序准备一条消息,通知DSP执行阶段已完成写入缓冲区,DSP现在可以访问缓冲区.该消息还包含写入缓冲区的数据量,以便DSP知道要复制的数据量.GPP使用DSPNode_PutMessage将消息发送到DSP,然后调用DSPNode_GetMessage等待从DSP收回消息.

在这些之后,DSP程序的执行开始,并且DSP在完成处理时通过消息通知GPP.只是为了尝试我不在DSP程序中进行任何处理.我只是将"处理完成"消息发送回GPP.这仍然需要耗费大量时间.可能是因为内部/外部内存使用,还是因为通信过载?

c c++ embedded signal-processing omap

6
推荐指数
1
解决办法
5974
查看次数

有没有办法在C++ 11中使用条件进行构造函数委派?

我试图使用C++ 11委托功能来构造一个以输入值为条件的类.这甚至可能吗?下面的代码在语法上不正确,但我把它放在这里是为了澄清.

enum MyEnum { A, B };

typedef struct {
  int val;
  MyEnum e;
} MyStruct;

class Foo {
public: 
  Foo(MyStruct a, MyStruct b) {} // a.e == A and b.e == B (assert checked)
  Foo(MyStruct x) {
    if (x.e == A) {
      return Foo(x, {0, B});
    } else {
      return Foo({0, A}, x);
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor delegation c++11

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