Is there any way to use Cycles to render a frame with two computers? I have a desktop PC and a laptop, both with a GTX 1070 and I would like render the same frame having 2 tiles, each tile being a graphic.
Distributed rendering is not built into Blender. Instead, you can download this addon called CrowdRender and install it for Blender. The addon helps you do renderings on multiple machines in parallel. You can follow the steps described in this video to install the addon and use it for rendering. The addon already works with Blender 2.8 and can also use EEVEE for distributed rendering.
You could also render your images to 32 bit EXR files and then merge them depending on the sample amount using Blender's compositing. For example if you have 800 samples in one image, and 200 samples in another you would mix 20% of the second one on top of the first one. Think of it this way: the final image is the average of all the samples computed so you just need to average the samples in the pixel values in the images. The images need to be rendered using different render seeds for it to work in addition to 32 bit EXR format for them not to loose any data.
You could also split the camera into a few cameras if for example you needed to render huge resolutions that start to be a problem memory wise to render the whole image at once. It might be a bit tricky to do that manually every time especially if you use lens shifting - I have a script that does it for me. It splits the camera selected as the active object into many and places markers on the timeline bonding them to each new camera so they are ready for rendering as an animation. Obviously this means that the method only works on still images. Here is the code(backup your work before running it just in case, note that you can change the number of cameras changing variable 'n'):
import bpy n = 3 # Change this to the number of tiles and columns that you want # 3 will split one camera into 3x3 grid, so 9 cameras bpy.ops.object.duplicate() data = bpy.context.object.data render = bpy.context.scene.render aspect = render.resolution_y / render.resolution_x data.lens = data.lens * n data.draw_size = data.draw_size / n data.shift_x = data.shift_x * n - (n/2 - 0.5) data.shift_y = (data.shift_y/aspect * n - (n/2 - 0.5))*aspect marker = bpy.context.scene.timeline_markers.new(bpy.context.object.name, frame=bpy.context.scene.frame_current) marker.camera = bpy.context.object bpy.context.scene.frame_current += 1 direction = 1 for i in range(0, n): for a in range(1, n): bpy.ops.object.duplicate() marker = bpy.context.scene.timeline_markers.new('', frame=bpy.context.scene.frame_current) marker.camera = bpy.context.object bpy.context.scene.frame_current += 1 bpy.context.object.data.shift_x += direction if i<n-1: bpy.ops.object.duplicate() marker = bpy.context.scene.timeline_markers.new('', frame=bpy.context.scene.frame_current) marker.camera = bpy.context.object bpy.context.scene.frame_current += 1 bpy.context.object.data.shift_y += aspect direction = direction * - 1