Skip to content
Snippets Groups Projects
Commit d3d6d2e8 authored by CHAMONT David's avatar CHAMONT David
Browse files

Second done is best

parent 1bfaaed9
No related branches found
No related tags found
No related merge requests found
#include <CL/sycl.hpp>
#include <iostream>
#include <vector>
namespace sycl = cl::sycl;
// Définition des constantes de l'équation de Gray-Scott
constexpr double Du = 0.02;
constexpr double Dv = 0.01;
constexpr double F = 0.04;
constexpr double k = 0.06;
constexpr double dt = 0.1;
// Fonction pour initialiser les données
void initializeData(std::vector<double>& u, std::vector<double>& v, int size) {
// Initialise u et v avec des valeurs aléatoires
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0.0, 1.0);
for (int i = 0; i < size; ++i) {
u[i] = 1.0 - dis(gen);
v[i] = dis(gen);
}
}
// Kernel pour mettre à jour les valeurs de u et v
class GrayScottKernel {
public:
GrayScottKernel(const double* u, const double* v, double* result_u, double* result_v)
: u_(u), v_(v), result_u_(result_u), result_v_(result_v) {}
void operator()(sycl::nd_item<1> item) {
size_t index = item.get_global_id(0);
double u = u_[index];
double v = v_[index];
double laplacian_u = 0.0;
double laplacian_v = 0.0;
// Calcul du laplacien
// ...
// Mise à jour des valeurs de u et v
// ...
result_u_[index] = u;
result_v_[index] = v;
}
private:
const double* u_;
const double* v_;
double* result_u_;
double* result_v_;
};
int main() {
const int size = 1000;
std::vector<double> u(size);
std::vector<double> v(size);
initializeData(u, v, size);
// Création de l'environnement SYCL
sycl::default_selector selector;
sycl::queue queue(selector);
// Allocation des buffers SYCL pour les données
sycl::buffer<double> uBuf(u.data(), sycl::range<1>(size));
sycl::buffer<double> vBuf(v.data(), sycl::range<1>(size));
sycl::buffer<double> resultUBuf(u.data(), sycl::range<1>(size));
sycl::buffer<double> resultVBuf(v.data(), sycl::range<1>(size));
// Lancement du kernel
queue.submit([&](sycl::handler& cgh) {
auto uAcc = uBuf.get_access<sycl::access::mode::read>(cgh);
auto vAcc = vBuf.get_access<sycl::access::mode::read>(cgh);
auto resultUAcc = resultUBuf.get_access<sycl::access::mode::write>(cgh);
auto resultVAcc = resultVBuf.get_access<sycl::access::mode::write>(cgh);
cgh.parallel_for<sycl::range<1>>(sycl::range<1>(size), GrayScottKernel(uAcc.get_pointer(), vAcc.get_pointer(), resultUAcc.get_pointer(), resultVAcc.get_pointer()));
});
// Copie des résultats de retour du buffer SYCL vers le vecteur
queue.wait();
resultUBuf.get_access<sycl::access::mode::read>().memcpy(u.data(), size * sizeof(double));
resultVBuf.get_access<sycl::access::mode::read>().memcpy(v.data(), size * sizeof(double));
// Affichage des résultats
for (int i = 0; i < size; ++i) {
std::cout << "u[" << i << "] = " << u[i] << ", v[" << i << "] = " << v[i] << std::endl;
}
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment