// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2016 // Mehdi Goli Codeplay Software Ltd. // Ralph Potter Codeplay Software Ltd. // Luke Iwanski Codeplay Software Ltd. // Contact: <eigen@codeplay.com> // Benoit Steiner <benoit.steiner.goog@gmail.com> // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
in1 = in1.random(); // Copy all data to device, then permute on copy back to host
sycl_device.memcpyHostToDevice(gpu_data, in1.data(), full_size * sizeof(DataType));
sycl_device.memcpyDeviceToHost(out.data(), gpu_data + half_size, half_size * sizeof(DataType));
sycl_device.memcpyDeviceToHost(out.data() + half_size, gpu_data, half_size * sizeof(DataType));
for (IndexType i = 0; i < half_size; ++i) {
VERIFY_IS_APPROX(out(i), in1(i + half_size));
VERIFY_IS_APPROX(out(i + half_size), in1(i));
}
in1 = in1.random();
out.setZero(); // Permute copies to device, then copy all back to host
sycl_device.memcpyHostToDevice(gpu_data + half_size, in1.data(), half_size * sizeof(DataType));
sycl_device.memcpyHostToDevice(gpu_data, in1.data() + half_size, half_size * sizeof(DataType));
sycl_device.memcpyDeviceToHost(out.data(), gpu_data, full_size * sizeof(DataType));
for (IndexType i = 0; i < half_size; ++i) {
VERIFY_IS_APPROX(out(i), in1(i + half_size));
VERIFY_IS_APPROX(out(i + half_size), in1(i));
}
in1 = in1.random();
out.setZero();
DataType* gpu_data_out = static_cast<DataType*>(sycl_device.allocate(full_size * sizeof(DataType)));
TensorMap<tensor_type> gpu2(gpu_data_out, tensorRange); // Copy all to device, permute copies on device, then copy all back to host
sycl_device.memcpyHostToDevice(gpu_data, in1.data(), full_size * sizeof(DataType));
sycl_device.memcpy(gpu_data_out + half_size, gpu_data, half_size * sizeof(DataType));
sycl_device.memcpy(gpu_data_out, gpu_data + half_size, half_size * sizeof(DataType));
sycl_device.memcpyDeviceToHost(out.data(), gpu_data_out, full_size * sizeof(DataType));
for (IndexType i = 0; i < half_size; ++i) {
VERIFY_IS_APPROX(out(i), in1(i + half_size));
VERIFY_IS_APPROX(out(i + half_size), in1(i));
}
for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(in1(i,j,k), 1.2f);
}
}
}
printf("a=1.2f Test passed\n");
for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(out(i,j,k),
in1(i,j,k) * 1.2f);
}
}
}
printf("a=b*1.2f Test Passed\n");
for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(out(i,j,k),
in1(i,j,k) *
in2(i,j,k));
}
}
}
printf("c=a*b Test Passed\n");
/// c=a+b
gpu_out.device(sycl_device) = gpu_in1 + gpu_in2;
sycl_device.memcpyDeviceToHost(out.data(), gpu_out_data,(out.size())*sizeof(DataType));
sycl_device.synchronize(); for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(out(i,j,k),
in1(i,j,k) +
in2(i,j,k));
}
}
}
printf("c=a+b Test Passed\n");
/// c=a*a
gpu_out.device(sycl_device) = gpu_in1 * gpu_in1;
sycl_device.memcpyDeviceToHost(out.data(), gpu_out_data,(out.size())*sizeof(DataType));
sycl_device.synchronize(); for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(out(i,j,k),
in1(i,j,k) *
in1(i,j,k));
}
}
}
printf("c= a*a Test Passed\n");
//a*3.14f + b*2.7f
gpu_out.device(sycl_device) = gpu_in1 * gpu_in1.constant(3.14f) + gpu_in2 * gpu_in2.constant(2.7f);
sycl_device.memcpyDeviceToHost(out.data(),gpu_out_data,(out.size())*sizeof(DataType));
sycl_device.synchronize(); for (IndexType i = 0; i < sizeDim1; ++i) { for (IndexType j = 0; j < sizeDim2; ++j) { for (IndexType k = 0; k < sizeDim3; ++k) {
VERIFY_IS_APPROX(out(i,j,k),
in1(i,j,k) * 3.14f
+ in2(i,j,k) * 2.7f);
}
}
}
printf("a*3.14f + b*2.7f Test Passed\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.