# #c #parallel-processing #sycl #intel-oneapi #dpc
Вопрос:
Я новичок в SYCL/DPC . Я написал код с использованием USM(Унифицированной общей памяти) и взял два массива хоста и массив устройств, в которых я хочу скопировать значения массива хостов в массив устройств, выполнить основные операции и распечатать значения. Но во время компиляции я получил ошибку.
Вот мой код.
#include <CL/sycl.hpp>
#include <array>
#include<iostream>
using namespace std;
using namespace sycl;
const int n = 6;
int main() {
queue q;
std::array<int,n> h_a;
int *d_a = malloc_device<int>(n, q);
for (int i = 0; i < n; i )
h_a[i] = n;
q.submit([amp;](handleramp; h) {
h.memcpy(d_a,h_a,n * sizeof(int));
});
q.wait();
q.submit([amp;](handleramp; h) {
h.parallel_for(n, [=](id<1> i) {
d_a[i] = d_a[i] * 2;
d_a[i] = d_a[i] 2;
d_a[i] = d_a[i] - 2;
d_a[i] = d_a[i] 2;
});
});
q.wait();
q.submit([amp;](handleramp; h) {
h.memcpy(h_a,d_a,n * sizeof(int));
});
q.wait();
for(int i = 0;i < n;i ){
cout<<h_a[i]<<" "<<d_a[i]<<" ";
}
cout<<"n";
free(d_a, q);
return 0;
}
Ошибка компиляции
simpleope.cpp:17:20: error: no viable conversion from 'std::array<int, n>' to 'const void *'
h.memcpy(d_a,h_a,n * sizeof(int));
/opt/intel/oneapi/compiler/2021.3.0/linux/bin/../include/sycl/CL/sycl/handler.hpp:2171:39: note: passing argument to parameter 'Src' here
void memcpy(void *Dest, const void *Src, size_t Count);
simpleope.cpp:32:16: error: no viable conversion from 'std::array<int, n>' to 'void *'
h.memcpy(h_a,d_a,n * sizeof(int));
/opt/intel/oneapi/compiler/2021.3.0/linux/bin/../include/sycl/CL/sycl/handler.hpp:2171:21: note: passing argument to parameter 'Dest' here
void memcpy(void *Dest, const void *Src, size_t Count);
2 errors generated.
Может ли кто-нибудь помочь мне, где я ошибся?
Заранее спасибо.
Комментарии:
1.->
h_a.data()
?2. Спасибо @Jarod42 Я добрался туда, где пропустил это, еще раз спасибо, что изучили мой код, он работал.
Ответ №1:
Синтаксис memcpy() таков
`void memcpy(void *Dest, const void *Src, size_t Count);`
Вам нужно передать второй параметр как «передать по ссылке», а не как «передать по значению». Вы можете передать amp;h_a (или) amp;h_a[0] (или) h_a.data() любой из них в качестве параметра, чтобы удалить эти ошибки в вашем коде.
Измененный код является
#include <CL/sycl.hpp>
#include <array>
#include<iostream>
using namespace std;
using namespace sycl;
const int n = 6; int main() {
queue q; std::array<int,n> h_a;
int *d_a = malloc_device<int>(n, q);
for (int i = 0; i < n; i )
h_a[i] = n;
q.submit([amp;](handleramp; h) {
h.memcpy(d_a,amp;h_a,n * sizeof(int));
});
q.wait();
q.submit([amp;](handleramp; h) {
h.parallel_for(n, [=](id<1> i) {
d_a[i] = d_a[i] * 2;
d_a[i] = d_a[i] 2;
d_a[i] = d_a[i] - 2;
d_a[i] = d_a[i] 2;
});
});
q.wait();
q.submit([amp;](handleramp; h) {
h.memcpy(amp;h_a,d_a,n * sizeof(int));
});
q.wait();
for(int i = 0;i < n;i ){
cout<<h_a[i]<<" "<<d_a[i]<<" ";
}
cout<<"n"; free(d_a, q);
return 0;
}