ошибка: нет жизнеспособного преобразования из ‘std::array’ в ‘const void *’ с использованием SYCL/DPC

# #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;
}​​​​