导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[转帖]如何并行SDRAM服务器[liufengzhong]

 *第54446篇: [转帖]如何并行SDRAM服务器

  
楼 主:liufengzhong 2014年9月7日15:06
 [转帖]如何并行SDRAM服务器

亲爱的朋友们,
我尝试使用SDRAM内存条是我自己的SDRAM服务器和工作非常接近的SDRAM片项目。该数据被读取来自每一1.6us,我通过XS1-L8A-64-TQ128-C5的32位端口采样。这工作得很好,如果我用的是内部SRAM。然而,这是不幸太小所以决定为SDRAM切片的文档中的描述使用SDRAM中。我设计我自己的董事会,并成立XtimeComposer项目基于SDRAM的模块。í并行化我的应用程序,SDRAM的服务器,也需要进行数据交换快速的UART模块:

 par {
      sdram_server(sdram_c, ports);
      meas_TX(sdram_c,uart_c);
      uart_tx_fast(p_tx, uart_c, tics);
    }

数据被写入到通过sdram_buffer_write函数附带了模块的SDRAM。存储一个整数

sdram_buffer_write (c_server, bank, row, 1, writebuff);
          //Wait until idle, i.e. the sdram had completed writing.
          sdram_wait_until_idle(c_server, writebuff);

大约需要1.7us(用示波器测量),因此是太长了。所以我决定收集128整数和一步到位,这需要(与sdram_buffer_write或sdram_full_row_write)左右为10us,但当然只发生每205us写出来。所以应该有足够的时间。不幸的是,sdram_wait_until_idle功能停止测量线程10我们,所以我错过了一些传入的数据点 - 即使我融入这个函数的功能,直接写程序。这一点,我不明白:在我看来,线程并行化应确保存储在不同的核心进行同时测量螺纹继续工作。
我的问题是:
 
1, 如何避免,该函数sdram_wait_until_idle遗址的表现?我尝试了很多东西(比如我在循环移动的sdram_wait_until_idle功能的写命令之前,以减少等待时间。好了,性能的提高,但遗憾的是不够好),并阅读了大量文档,但现在经过一个星期,我有我自己没有什么更多的想法。
 
2, 我可以加速通过c_server流chanend的表现?这些应该更快,并且不需要使用之后被关闭。
 
3, 是否有可能让在多个内核上的SDRAM的服务器上运行?我已经看到了这一点,在基准测试程序,但我不知道这是否会有所帮助。这是特别真实的,因为在基准测试的性能确实不随所用的核心数。
 
我明白任何形式的帮助,并希望尽快得到您阅读。

托尔斯滕


回答:

托尔斯滕,

我有好消息告诉你 - 这是绝对有可能的。我刚刚做了一个非常类似的事情与实施音频延迟我的DSP项目,该项目是将更多的数据到SDRAM,并以更快的速度比你的需要。有几个不同的方法来实现这一目标。我用C和XC的混合物线程之间共享内存,并降低数据移动在渠道的数量,但你可能只做到了越野通过拆分成两个线程是这样的:

read_thread(chanend c_data)
{  
int buffer[128];  
while(1)  
{  
for(int i = 0; i   < 128; i++)  
{ read data into buffer }  
for(int i = 0; i   < 128; i++)  
{ c_data   <: buffer[i]; }  
}
}
write_thread(chanend c_data, chanend c_sdram_server)
{
   int buffer[128];
   while(1)
   {
      for(int i = 0; i   < 128; i++)
      { c_data :>   buffer[i]; }
      sdram_write()
      sdram_wait_idle();
   }
}


我认为,你想要做什么,应该足够快。如果这还不够快,或者如果我不明白你的问题吧,让我知道,我会看看我能不能解释一下C语言的共享内存的方法

回复:

你好,谢谢你的回答。我实现的代码,并想通了,第二for循环(为(int i = 0; I   <128;我+ +){C_DATA   <:缓冲区由[i];}})在read_thread现在需要大约20US,从而战利品性能(如wait_until_idle功能做之前)。现在,我有以下意见/问题: - 我需要使用异步信道传输,它应该可以通过“交易”通道。然而,这些都必须恰好与一个chanend定义,所以我不能包括SDRAM,chanends。所以,你也许忘记了“奴隶”,“大师”,或“交易” - 命令? - 在您的建议,您使用的SDRAM通道服务器和写程序。不过,我还需要获得该数据从SDRAM服务器返回到它传送到PC上。由于chanend只能在两个并行的线程中使用,我需要一个新的解决方案,在这里也。 - 我需要的时钟在每1.6us(微秒)的数据 - 而不是毫秒。既然你提到一个音频项目(我联想到毫秒时间),也许你误解了我的要求吗?正如你可能已经意识到,我是相当新手,那么请道歉,如果我监督了一些东西明显。托尔斯滕


回答:

托尔斯滕。我的音乐应用程序时钟12X 32位样本每在10uS和读/写的SDRAM在同一时间,我已经得到了很多的处理器周期不遗余力的时刻,所以我觉得你的问题是绝对有可能的。我的方法是使用一种黑客的读/写数据使用C函数的缓冲区。这意味着编译器可以让你在其中XC不会让你这样做的AFAIK两个线程之间的共享缓冲内存。这是完全安全的,如果你知道自己在做什么,几个XMOS模块的使用这个方法,如果你仔细看。对于这个应用程序是什么意思是不是发送read_thread()和write_thread 128之间的整数(),你可以只发送一个整数,表明缓冲区已满的​​write_thread()就可以开始将缓冲区写入到SDRAM中。当然,这也意味着你需要2个缓冲区 - 一个用于读取数据,而另一个被写入到SDRAM进入。读取数据出来的SDRAM可以采用完全相同的方法完全相同的线程来完成 - 我的音乐应用程序写入12个数据缓冲区,以12种不同的SDRAM的地址,然后做同样的与用于读缓存不同的存储位置,我已经仍然有很多空闲的CPU周期。


回复:

我再次感谢你为你的快速反应和道歉,怀疑你的阅读能力。; - )但是从你的第一封邮件我并没有真正得到我必须让我们的C,以避免XC的限制。所以,如果我得到了你的权利,你

通过C-1,常规端口写入数据到一个全局缓存(在我的情况下,大小128)

2,每次缓冲区满时,您是通过chanend到SDRAM-write_thread,然后通过C程序到SDRAM中写入全局缓冲区的内容发送类似于一个整数标志。

我试图实现这一点,想通了,它通过chanend传送一个整数这就通常需要不到100ns的。然而,有时需要长达时间1.4us,使得丢失的数据点成为可能。您是否也遇到过,或者是错过了点不适合音频应用的关键?

你也提到你的项目,我不知道这是否可能开放源码?如果没有,我将不胜感激,如果你可以给我使用C方法来避免XC-局限性XMOS的模块之一的名称。

我的下一个步骤是运行andrewstanfordjason项目,然后继续你的建议。


回答:

是的,你已经得到了正确的方法。您是否使用了流信道传输的两个线程之间的一个整数标志?这可能是你得到一个变量时,如果你不发送数据的原因。我使用的是流媒体频道,因为我的音乐线程设计,使其小姐样品是不可能的。我怕我的项目将不会开源,因为它是一个商业产品的一部分。我想帮你解决这个问题,但因为我花了相当长的时间来弄明白。我觉得XMOS的以太网项目采用了类似的共享内存的方法在几个在5线程实现的地方。


回答2:

我一直在努力解决这个:一个新的SDRAM服务器。它可以在GitHub上找到的 

它有例子和文档,但还没有准备好全面发行。随意搏一搏。它支持: 

*缓冲区读+写,

*一个或多个客户

*异步命令长度为8的为每个客户端的命令队列解耦 

  现在可以达到62.5兆赫(或更多更多的MIPS)

如果你使用它,然后随意反馈经验。

安德鲁

回复:

感谢您的回答。我花了一段时间,但最终我实现的代码。延误特别是引入了一个事实,即我不使用Slicekit,并从产生的改性端口定义。但我想通了如何纠正这一点。此外,我必须设置时钟分频的4至5得到稳定的结果。其实现在我的两个测试布局的工作,而人做了不与原来的SDRAM内存的服务器。:-)我sssume的时机是一个关键的问题,在这里。

我的发言/问题是:
如果我设置BUF_WORDS为值大于128时,该项目挂client.xc的@排47
为了使该方案将值我要取消“的瓷砖[SDRAM_A16_TRIANGLE_TILE]:PAR(INT I = 0;我  <6;我+ +)(1),而”在标准杆语句。
读出功能的效果很好,而我无法将值写入SDRAM中。
有什么推荐的参考和系统频率(我用的100MHz的500MHz的和)?
由于整个项目太复杂了认识很短的时间,现在我会尝试解决的延迟问题,通过代码分离成C和XC-块作为红眼建议。

再次感谢,托尔斯滕


回答3:


托尔斯滕。还回顾其严重缺乏适当和必要的文件相同的代码。更多关于审查结束之后,后来。试图将代码移植过来的startKit。

你有没有检讨的app_sdram_demo项目为sliceKit?它显示了如何并行相同的代码。此外,sdram_wait_until_idle需要被放置在写操作之后或阅读的SDRAM,确认完成的任务。

你有没有试图将数据写入一个较小的块?也就是说,一个值小于128的整数?这是否影响你的项目或时间学习?如果你不使用的UART的功能?这是否提高你的SDRAM的标杆?

在(很差)记录代码吸SDRAM中的页面写入,然后执行一个突发TERMINATE操作码到SDRAM。该突发TERMINATE是在代码中的汇编程序的一部分。最实际的阅读和写作是在汇编程序通过“。公司”源文件执行。
 
库马尔


回复:

库马尔你好,谢谢你的提示,但遗憾的是他们没有真的帮了我。我在文档阅读,尝试更小的数据块,并且还省去了UART传输。现在,我会给安德鲁项目的机会。托尔斯滕


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[转帖]64位版本的xTIMEcomposer社区

[下一篇主题]:[转帖]XC-2替代是否有任何计划?