#include <CL/sycl.hpp>
#include <iostream>
#include <vector>
constexpr size_t KERNEL_SIZE = 5; // 卷积核尺寸
constexpr size_t IMAGE_WIDTH = 100; // 图像宽度
constexpr size_t IMAGE_HEIGHT = 100; // 图像高度
// 定义卷积核
const float kernel[9]={1,0,1,2,0,-2,1,0,1};
// 定义输入图像
const std::vector<float> inputImage = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16};
// 定义输出图像
std::vector<float> outputImage(IMAGE_WIDTH * IMAGE_HEIGHT);
int main() {
// 创建一个队列来执行DPC++任务
cl::sycl::queue queue;
// 创建输入和输出缓冲区
cl::sycl::buffer<float, 2> inputBuffer(inputImage.data(),
cl::sycl::range<2>(IMAGE_HEIGHT, IMAGE_WIDTH));
cl::sycl::buffer<float, 2> outputBuffer(outputImage.data(),
cl::sycl::range<2>(IMAGE_HEIGHT, IMAGE_WIDTH));
// 提交DPC++任务
queue.submit([&](cl::sycl::handler& cgh) {
// 获取输入和输出访问器
auto inputAccessor = inputBuffer.get_access<cl::sycl::access::mode::read>(cgh);
auto outputAccessor = outputBuffer.get_access<cl::sycl::access::mode::write>(cgh);
// 定义内核函数
cgh.parallel_for<class ConvolutionKernel>(cl::sycl::range<2>(IMAGE_HEIGHT, IMAGE_WIDTH),
[=](cl::sycl::item<2> item) {
size_t row = item[0];
size_t col = item[1];
// 执行卷积操作
float result = 0.0f;
for (int i = -1; i <= 1; ++i) {
for (int j = -1; j <= 1; ++j) {
if (row + i >= 0 && row + i < IMAGE_HEIGHT &&
col + j >= 0 && col + j < IMAGE_WIDTH) {
float pixel = inputAccessor[row + i][col + j];
float kernelValue = kernel[(i + 1) * KERNEL_SIZE + (j + 1)];
result += pixel * kernelValue;
}
}
}
outputAccessor[item] = result;
});
});
// 将输出图像从设备内存复制到主机内存
queue.wait_and_throw();
queue.submit([&](cl::sycl::handler& cgh) {
auto outputAccessor = outputBuffer.get_access<cl::sycl::access::mode::read>(cgh);
cgh.copy(outputAccessor, outputImage.data());
});
queue.wait_and_throw();
// 打印输出图像
std::cout << "Output Image:\n";
for (size_t i = 0; i < IMAGE_HEIGHT; ++i) {
for (size_t j = 0; j < IMAGE_WIDTH; ++j) {
std::cout << outputImage[i * IMAGE_WIDTH + j] << " ";
}
std::cout << "\n";
}
return 0;
}
代码验证:
1.测试样例:
// 定义卷积核
const float kernel[9]={1,0,1,2,0,-2,1,0,1};
// 定义输入图像
const std::vector<float> inputImage = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16};
2.测试结果:
3.黑客松基准数据集的结果:
可见,结果正确。