【发布时间】: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 不,如果所有线程都在写入相同的值,这不是未定义的行为。写入完成后,该位置保证包含写入的值。