【问题标题】:VexCL Reshape Behaving StrangelyVexCL 重塑行为异常
【发布时间】:2016-11-02 04:57:11
【问题描述】:

我有以下代码 sn-p 测试 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)”。

【问题讨论】:

  • 为什么要在一维阵列上使用vex::extents[1][0]?应该只是vex::extents[0]
  • 好吧,我正在使用 vex::extents 对象定义形状。所以在这种情况下,我告诉它矩阵是 n/2 行 x 2 列。我遵循了文档中的矩阵转置示例。
  • 在整形部分here
  • 我知道dst 格式必须是[2][n/2],但src 是一维向量,而不是您要转置的二维向量。我对范围格式不完全有信心,所以我可能是错的......在我看来应该只是 vex::extents[0] 说明你想要一维直接填充。

标签: opencl vexcl


【解决方案1】:

从您的表达式生成的内核将vex_ints 用于输入和输出。由于vex::reshape 所做的基本上是一种排列,因此您不能就地执行此操作。请尝试将结果分配给不同的向量,看看这是否可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2018-03-09
    相关资源
    最近更新 更多