Parallel processing Cuda网格大小限制似乎低于应有的限制
我有一台GTX780。根据维基百科和直接查询设备的代码输出,它的计算能力为3.5。根据这两个定义,它的块x维度大小限制为2^31-1(2147483647)。然而,以下代码仅在Parallel processing Cuda网格大小限制似乎低于应有的限制,parallel-processing,cuda,Parallel Processing,Cuda,我有一台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开关编译代码,也没有任何区别。