我尝试在 GPU 上执行我的 slice_matrix 函数。实际功能是:
//Function which Slice a specific part of my matricx
template<class T>
std::vector<std::vector<T>> slice_matrix(std::vector<std::vector<T>> mat, int i,
int j, int r, int c) {
std::vector<std::vector<T>> out(r, std::vector<T>(c, 0));
for (int k = 0; k < r; k++) {
std::vector<T> temp(mat[i + k].begin() + j, mat[i + k].begin() + j + c);
out[k] = temp;
}
return out;
};
我的代码的 SYCL 部分是:
auto event = gpuQueue.submit(
[&](sycl::handler &h) {
//local copy of fun
auto f = fun;
sycl::accessor img_accessor(img_buffer, h,
sycl::read_only);
sycl::accessor ker_accessor(ker_buffer, h,
sycl::read_only);
sycl::accessor out_accessor(out_buffer, h,
sycl::write_only);
h.parallel_for(sycl::range<2>(img_row, filt_col),
[=](sycl::id<2> index) {
int row = index[0];
int col = index[1];
out_accessor[index] = f(slice_matrix_gpu(img_accessor, row, col, filt_row, filt_col), ker_accessor);
});
});
我知道 vector<vector> 不会创建连续的内存块。所以我使用了向量,并尝试将其解释为二维数据块。我定义的:
/*change 2D Matrices to the 1D linear arrays,
*
*and operate on them as contiguous blocks */
int M = img_row * img_col;
int N = filt_row * filt_col;
int H = out_row * out_col;
//Define Buffer for
sycl::buffer<Tin, 1> img_buffer(&img[0], sycl::range<1>(M));
sycl::buffer<Tin, 1> ker_buffer(&ker[0], sycl::range<1>(N));
sycl::buffer<Tin, 2> out_buffer(&out[0], sycl::range<2>(out_row, out_col));
但我不知道该怎么办?!我应该像 2D 一样传递我的访问器,还是应该更改 slice_matrix 并表现得像 2D 矩阵。我应该指出 slice_matrix 函数可能被其他函数调用,在这种情况下它在 CPU 上执行。我的意思是这个函数不仅用于在 GPU 上执行,它还用于在 CPU 上执行,即:
if (use_tbb) {
uTimer *timer = new uTimer("Executing Code On CPU");
tbb::parallel_for(
tbb::blocked_range2d<int, int>(0, out_row, 0, out_col),
[&](tbb::blocked_range2d<int, int> &t) {
for (int n = t.rows().begin(); n < t.rows().end();
++n) {
for (int m = t.cols().begin(); m < t.cols().end();
++m) {
out[n][m] = fun(
slice_matrix_cpu(img, n, m, filt_row,
filt_col), ker);
}
}
});
timer->~uTimer();
return out;