Я пытаюсь сделать простой вектор-матричный продукт с OpenCL, используя библиотеку ViennaCL.ViennaCL: матрично-векторный продукт не работает
Вот мое главное:
#include "viennacl/scalar.hpp"
#include "viennacl/vector.hpp"
#include "viennacl/matrix.hpp"
#include "viennacl/linalg/prod.hpp"
#include "viennacl/matrix_proxy.hpp"
#include "viennacl/linalg/lu.hpp"
int main()
{
viennacl::ocl::set_context_device_type(0, viennacl::ocl::gpu_tag());
std::vector<viennacl::ocl::device> devices = viennacl::ocl::current_context().devices();
viennacl::ocl::current_context().switch_device(devices[0]);
int Nx=10;
int Ny=10;
//GPU vectors
viennacl::matrix<float> vcl_A(Nx,Ny);
viennacl::vector<float> vcl_b(Ny);
viennacl::vector<float> vcl_c(Nx);
//CPU vectors
std::vector<float> stl_A(Nx*Ny);
std::vector<float> stl_b(Ny);
std::vector<float> stl_c(Nx);
//filling CPU vectors
for (unsigned int i = 0; i < Nx; ++i)
for (unsigned int j = 0; j < Ny; ++j)
stl_A[i*Ny + j] = (float) (rand()%100);
for (unsigned int i = 0; i < stl_b.size(); ++i)
stl_b[i] = (float) (rand()%100);
//copying input data to GPU
viennacl::fast_copy(&(stl_A[0]),
&(stl_A[0]) + stl_A.size(),
vcl_A);
viennacl::fast_copy(stl_b, vcl_b);
//launching product c = A*b
vcl_c = viennacl::linalg::prod(vcl_A, vcl_b);
//copying output data back to CPU
viennacl::copy(vcl_c, stl_c);
viennacl::backend::finish();
}
Затем мой stl_c вектор имеет свой первый коэффициент правильно вычислить, но каждые 9 других coefs являются 0
. Когда я изменяю размеры до верхних значений, я получаю больше одного правого коэффа в начале моего вектора, но я все еще получаю кучу нулей для всех других коэффиков.
Я предполагаю, что некоторые из моих копий сделали неправильный путь, но, может быть, моя операция прода в причинах (местном выпуске/globalsize, но я полагаю, ViennaCL заботится обо всем этом)
Любой идея о том, что я делаю не так? Любая помощь или совет будут действительно оценены.
(Я бегу код на VS 2012, мой GPU является NVIDIA GeForce GTX 670)
Я полностью пропустил эту часть о нулевой прокладке ... Большое спасибо за этот ясный и полный ответ! Теперь он отлично работает. – eyam