Is Parallel Programming Hard, And, If So, What Can You Do About It?