thrust :: max_element是在主机还是设备上运行?

时间:2016-01-29 14:14:17

标签: c++ cuda thrust

我需要找到存储在我的设备上的长数组中的最大元素。我以为我可以使用thrust :: max_element这样做。我在下面的代码中调用while循环中的thrust :: max_element。我只是给它两个设备指针(请注意,real只是float的typedef)。我不能只传递thrust :: max_element设备指针。它是否试图在主机上找到最大元素?我问这个是因为我的代码在那之后失败了一个seg错误。

exports.config = {

  specs: [
    'features/**/*.feature'
  ],

  capabilities: {
    'browserName': 'chrome'
  },

  baseUrl: 'http://127.0.0.1:8000/',

    framework: 'custom',
    frameworkPath: require.resolve('protractor-cucumber-framework'),
  // relevant cucumber command line options
  cucumberOpts: {
    require: ['features/support/world.js', 'features/sampleSteps.js'],
    format: "summary"
  }
};

1 个答案:

答案 0 :(得分:2)

通常,推力使用传递的迭代器的类型来确定算法后端是否将在主机或设备上运行(在最新版本中还有无标记和显式执行策略选择,但这是一个不同的讨论)。

在您的情况下,因为grid_d主机指针(无论其是主机还是设备地址无关紧要),推力会尝试并运行主机上的算法。这是segfault的来源,您正尝试访问主机上的设备地址。

要使其工作,您需要将指针强制转换为thrust::dev_ptr,例如:

thrust::device_ptr<real> grid_start = thrust::device_pointer_cast(grid_d);
thrust::device_ptr<real> grid_end= thrust::device_pointer_cast(grid_d + DIM * DIM * DIM);

auto max_it = thrust::max_element(grid_start, grid_end);
max_error = *max_it;

[警告,用浏览器编写,从未编译或测试,使用风险自负]

通过传递thrust::dev_ptr,选择正确的标签,闭包将在设备上运行。

另一种没有强制转换的解决方案是指定execution policy device

thrust::max_element(thrust::device, grid_d, grid_d + DIM * DIM * DIM);

仅在Thrust 1.7及更高版本上支持显式执行策略控制。