Drag to resize
Summary: So why use sop nulls if they don't do anything? Because, in practice, it's a great way to organize your node graph when you want to label the end of a node tree. Just use all capital letters (ex: OUT_PYRO_SOURCE) and it makes it easy to browse for that part of your graph. You can also fill this empty object with user parameters which can control other things in your scene.
Why use OBJ level nodes? Because if you plug this node into any other OBJ node, it can be used to transform that object. On the OBJ level, these nulls are also good for specifying aims on your lights.
Drag to resize
Main Parameters:
Copy Input
-- Take a look at the node which is connected to the SOP null. If copy input is turned on, that's saying "be sure that you copy the data from the connected node into this empty null object." If you uncheck this box, it will not copy the information into the null, but it will force the connected node to cook. This is useful if you want something to cook without collecting the data in the null. ROP dependencies might benefit from forcing things to cook, but in most situations, you don't need to alter this setting.
Cache Input:
-- This is not the same as "freezing" your node with the lock icon. According to the docs, "If this flag is turned on, then the null will cache its input. This makes it possible to unload the Null SOP’s input. This flag is off by default." In truth, if you're trying to cache something out in Houdini, it's best to use a file cache sop. In practice, it is not common to check this box on.