About assembly language, it is not necessary, well, except for some concrete DSP instructions or some dirty hacks, if you have enough knowledge to do them. Clear understanding of assembly language is really helpful when you need to debug your code at low level, and by knowing/understanding it you probably will be able to write more efficient C/C++ code. For some crazy optimizations you will end up looking at generated assembly and thinking how to change your C/C++ code to provoke compiler to generate better code, but it is extremely rare and unlikely.
Modern C/C++ compilers do really good work, producing better binary code in most cases, than someone will write in assembly. C/C++ is easy to read and maintain in times, compared to assembly.
I have one great example for capabilities of C compiler. Before a time i play just for fun with my C code ( for TI MSP430 processor ), which was really crazy optimized to levels, not easy accessible from everyone from assembler. In it i do not leave room for any further compiler optimizations. Not directly related to your question, but related to C/C++ vs assembler power in it. By using C, i do this in couple of hours. If i used assembler, it will take weeks and the result is not clear. I understand assembler and I am capable of writing on it, but I am not so productive on it. In this project I used generated assembly as helper to understand and identify weak points of TI C compiler and to push it to its limits. You can see it here: http://www.youtube.com/watch?v=reWGWWCPbEo
For DSP instructions, usually there are already ready libraries. Usually they are already optimized, so your only work is to get them and use them. Bets and hopes are that they are better optimized than your own code. If you have enough time and wish to identify some weak points in them, usually you can contact their authors and contribute for improvements, or always you can produce better ones and hopefully publish them.