Parallel processing Cuda网格大小限制似乎低于应有的限制

Parallel processing Cuda网格大小限制似乎低于应有的限制,parallel-processing,cuda,Parallel Processing,Cuda,我有一台GTX780。根据维基百科和直接查询设备的代码输出,它的计算能力为3.5。根据这两个定义,它的块x维度大小限制为2^31-1(2147483647)。然而,以下代码仅在阻塞

我有一台GTX780。根据维基百科和直接查询设备的代码输出,它的计算能力为3.5。根据这两个定义,它的块x维度大小限制为2^31-1(2147483647)。然而,以下代码仅在
阻塞<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);
}
#包括
#包括
#define print(x)cout基本相同。我需要专门使用
-arch=sm_35
标记进行编译

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

当所有线程都尝试写入同一位置时,这不是竞争条件和未定义的行为吗?使用适用于GPU的适当架构开关编译,例如
-arch=sm_35
@huseyintugrulbuyukisik不,如果所有线程都写入相同的值,这不是未定义的行为。写入完成后,该位置保证包含写入的值。这与您链接的问题不同。链接问题的块大小太大(对于任何GPU)。一旦块和网格大小被反转,代码将在任何GPU上运行(它不会超过任何限制),这里没有提到使用arch开关编译,如果使用我们的无arch开关编译代码,也没有任何区别。