【问题标题】:Cuda grid size limitations appear to be lower than they should [duplicate]Cuda网格大小限制似乎低于应有的水平[重复]
【发布时间】:2016-04-15 18:57:12
【问题描述】:

我有一台 GTX780。根据维基百科和直接查询设备的代码输出,它的计算能力为 3.5。根据两者,它的块 x 尺寸限制为 2^31-1 (2147483647)。然而,下面的代码仅在blocks < 2^16-1 (65535) 时成功设置a[0]=1。这是 2.x 及更早版本的维基百科列出的限制。

#include <iostream>
#include <string>

#define print(x) cout << #x << " = " << x << endl;
#define arg_read(pos, init) argc>pos? stoi(argv[pos]): init;

using namespace std;

__global__ void f(int* a)
{
  a[0] = 1;
}

int main(int argc, char* argv[])
{
  int blocks = arg_read(1, 1);
  int* a;
  cudaMalloc((void**) &a, sizeof(int)); //allocate a on the device
  int b=100;
  cudaMemcpy(a, &b, sizeof(int), cudaMemcpyHostToDevice); //copy b to a
  f<<<blocks, 1>>>(a); //set a[0] = 1
  cudaMemcpy(&b, a, sizeof(int), cudaMemcpyDeviceToHost); //copy a back to b
  print(b);
}

【问题讨论】:

  • 当所有线程都尝试写入同一位置时,这不是竞争条件和未定义的行为吗?
  • 为您的 GPU 使用适当的架构开关进行编译,例如。 -arch=sm_35
  • @huseyintugrulbuyukisik 不,如果所有线程都在写入相同的值,这不是未定义的行为。写入完成后,该位置保证包含写入的值。

标签: parallel-processing cuda


【解决方案1】:

本质上是相同的problem as here。我需要使用-arch=sm_35 标签专门编译。

nvcc -arch=sm_35 sandbox.cu -o sandbox.exe

【讨论】:

  • 这与您链接的问题不同。链接问题的块大小太大(对于任何 GPU)。一旦块和网格大小被反转,代码将在任何 GPU 上运行(它不超过任何限制)并且没有提到在那里使用拱开关进行编译,如果使用我们的代码编译,也没有任何区别没有任何拱形开关。
猜你喜欢
  • 2015-07-25
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2012-02-24
  • 2011-10-18
相关资源
最近更新 更多