def tree_of(template, sizes, context): if issubclass(template, sc.templates.elementwise_1d): N, = sizes x = sc.empty(N, dtype=sc.float32, context=context) y = sc.empty(N, dtype=sc.float32, context=context) return sc.assign(y, x + y), (x, y) elif issubclass(template, sc.templates.reduce_1d): N, = sizes x = sc.empty(N, context=context) y = sc.empty(N, context=context) return sc.dot(x, y), (x, y) elif issubclass(template, sc.templates.elementwise_2d): M, N = sizes A = sc.empty((M, N), context=context) B = sc.empty((M, N), context=context) return A + B, (A, B) elif issubclass(template, sc.templates.reduce_2d): T = template is sc.templates.reduce_2d_cols M, N = sizes[::-1] if T else sizes A = sc.empty((M, N), context=context) x = sc.empty(N, context=context) return sc.dot(A.T, x) if T else sc.dot(A, x), (A, x) elif issubclass(template, sc.templates.matrix_product): AT = template is sc.templates.matrix_product_tn or template is sc.templates.matrix_product_tt BT = template is sc.templates.matrix_product_nt or template is sc.templates.matrix_product_tt M, N, K = sizes A = sc.empty((K, M) if AT else (M, K), context=context) B = sc.empty((N, K) if BT else (K, N), context=context) AA = A.T if AT else A BB = B.T if BT else B return sc.dot(AA, BB), (A, B)
def tree_of(template, sizes, context): if issubclass(template, sc.templates.elementwise_1d): N, = sizes x = sc.empty(N, dtype=sc.float32, context=context) y = sc.empty(N, dtype=sc.float32, context=context) return sc.assign(y, x + y), (x, y) elif issubclass(template, sc.templates.reduce_1d): N, = sizes x = sc.empty(N, context=context) y = sc.empty(N, context=context) return sc.dot(x, y), (x, y) elif issubclass(template, sc.templates.elementwise_2d): M, N = sizes A = sc.empty((M,N), context=context) B = sc.empty((M,N), context=context) return A + B, (A, B) elif issubclass(template, sc.templates.reduce_2d): T = template is sc.templates.reduce_2d_cols M, N = sizes[::-1] if T else sizes A = sc.empty((M,N), context=context) x = sc.empty(N, context=context) return sc.dot(A.T, x) if T else sc.dot(A, x), (A, x) elif issubclass(template, sc.templates.matrix_product): AT = template is sc.templates.matrix_product_tn or template is sc.templates.matrix_product_tt BT = template is sc.templates.matrix_product_nt or template is sc.templates.matrix_product_tt M, N, K = sizes A = sc.empty((K, M) if AT else (M, K), context=context) B = sc.empty((N, K) if BT else (K, N), context=context) AA = A.T if AT else A BB = B.T if BT else B return sc.dot(AA, BB), (A, B)
import isaac as sc import isaac.templates as templates sc.driver.default.queue_properties = sc.driver.PROFILING_ENABLE sc.driver.default.device = 0; #Construct vectors using the default device. M, N, K = 972, 1541, 793 A = sc.empty((M, K), sc.float32) B = sc.empty((K, N), sc.float32) #Get command queue queue = A.context.queues[0] #Benchmark profile 1 queue.profiles[sc.templates.gemm_nn, sc.float32] = sc.profile(templates.gemm_nn(1,8,16,8,1,8,1,8,templates.FETCH_FROM_LOCAL,templates.FETCH_FROM_LOCAL,8,8), sc.float32, queue) C, events = sc.driver.enqueue(sc.reduce_1d(A, B)) C.context.synchronize() print 'Profile 1 finished in', sum([e.elapsed_time for e in events])*1e-9, 's' #Benchmark profile 2 queue.profiles[sc.templates.gemm_nn, sc.float32] = sc.profile(templates.gemm_nn(1,8,16,16,1,8,1,8,templates.FETCH_FROM_LOCAL,templates.FETCH_FROM_LOCAL,8,16), sc.float32, queue) C, events = sc.driver.enqueue(sc.reduce_1d(A, B)) C.context.synchronize() print 'Profile 2 finished in', sum([e.elapsed_time for e in events])*1e-9, 's'
import isaac as sc N = 7 platforms = sc.driver.get_platforms() devices = [d for platform in platforms for d in platform.get_devices()] device = devices[0] print 'Using', device.name, 'on', device.platform.name context = sc.driver.context(device) x = sc.empty(N, sc.float32, context) y = sc.empty(N, sc.float32, context) z, events = sc.driver.enqueue(x + y) z.context.synchronize() print z
def tree_of(template, sizes, context): if issubclass(template, sc.templates.elementwise_1d): N, = sizes x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(N, dtype=dtype, context=context) return sc.assign(y, x + y), (x, y) elif issubclass(template, sc.templates.reduce_1d): N, = sizes x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(N, dtype=dtype, context=context) return sc.dot(x, y), (x, y) elif issubclass(template, sc.templates.elementwise_2d): M, N = sizes A = sc.empty((M, N), dtype=dtype, context=context) B = sc.empty((M, N), dtype=dtype, context=context) return A + B, (A, B) elif issubclass(template, sc.templates.reduce_2d): T = template is sc.templates.reduce_2d_cols M, N = sizes[::-1] if T else sizes A = sc.empty((M, N), dtype=dtype, context=context) x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(M, dtype=dtype, context=context) return sc.assign(x, sc.dot(A.T, y)) if T else sc.assign( y, sc.dot(A, x)), (A, x, y) elif issubclass(template, sc.templates.gemm): AT = template is sc.templates.gemm_tn or template is sc.templates.gemm_tt BT = template is sc.templates.gemm_nt or template is sc.templates.gemm_tt M, N, K = sizes C = sc.empty((M, N), dtype=dtype, context=context) A = sc.empty((K, M) if AT else (M, K), dtype=dtype, context=context) B = sc.empty((N, K) if BT else (K, N), dtype=dtype, context=context) AA = A.T if AT else A BB = B.T if BT else B return sc.assign(C, sc.dot(AA, BB)), (A, B, C)
def tree_of(template, sizes, context): if issubclass(template, sc.templates.elementwise_1d): N, = sizes x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(N, dtype=dtype, context=context) return sc.assign(y, x + y), (x, y) elif issubclass(template, sc.templates.reduce_1d): N, = sizes x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(N, dtype=dtype, context=context) return sc.dot(x, y), (x, y) elif issubclass(template, sc.templates.elementwise_2d): M, N = sizes A = sc.empty((M,N), dtype=dtype, context=context) B = sc.empty((M,N), dtype=dtype, context=context) return A + B, (A, B) elif issubclass(template, sc.templates.reduce_2d): T = template is sc.templates.reduce_2d_cols M, N = sizes[::-1] if T else sizes A = sc.empty((M,N), dtype=dtype, context=context) x = sc.empty(N, dtype=dtype, context=context) y = sc.empty(M, dtype=dtype, context=context) return sc.assign(x, sc.dot(A.T, y)) if T else sc.assign(y, sc.dot(A, x)), (A, x, y) elif issubclass(template, sc.templates.gemm): AT = template is sc.templates.gemm_tn or template is sc.templates.gemm_tt BT = template is sc.templates.gemm_nt or template is sc.templates.gemm_tt M, N, K = sizes C = sc.empty((M,N), dtype=dtype, context=context) A = sc.empty((K, M) if AT else (M, K), dtype=dtype, context=context) B = sc.empty((N, K) if BT else (K, N), dtype=dtype, context=context) AA = A.T if AT else A BB = B.T if BT else B return sc.assign(C, sc.dot(AA, BB)), (A, B, C)