VexCL изменить свое поведение странно

У меня есть следующий фрагмент кода, тестирующий функцию изменения формы VexCL:

std::vector<int> ints;
for (int i = 0; i < n; i++) ints.push_back(i);
vex::vector<int> vex_ints(ctx, ints);
vex_ints = vex::reshape(vex_ints, vex::extents[2][n/2], vex::extents[1][0]);
for(int i=0; i<n; i++) std::cout << vex_ints[i] << " "; std::cout << std::endl;

Все, что он делает, это печатает четные целые числа, которые меньше n, за которыми следуют нечетные целые числа, которые меньше n. Например, когда n=10, он печатает:

0 2 4 6 8 1 3 5 7 9 

Но вещи ведут себя странно, когда n становится большим. Например, когда n=10000, первые 50 напечатанных целых чисел:

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196

Который начинает ошибаться после 62. Существуют и другие несоответствия дальше по выходу, и некоторые четные числа появляются после нечетных чисел. Кто-нибудь может объяснить, почему это происходит? Если это имеет значение, я использовал контекст "GeForce GT 650M (Apple)".

1 ответ

Решение

Ядро, сгенерированное из вашего выражения, использует vex_ints как для ввода и вывода. С чего vex::reshape делает это в основном перестановка, вы не можете сделать это на месте. Пожалуйста, попробуйте присвоить результат другому вектору и посмотрите, решит ли это проблему для вас.

Другие вопросы по тегам