Ich habe eine GTX780. Es hat Rechenkapazität 3.5, sowohl nach Wikipedia als auch der Ausgabe von Code, der das Gerät direkt abfragt. Es hat Blockgröße Dimension Limit von 2^31-1 (2147483647), nach beiden. Der folgende Code setzt jedoch nur erfolgreich a[0]=1
wenn blocks < 2^16-1
(65535). Das ist das Limit für Wikipedia-Listen für Versionen 2.x und älter.Cuda Grid Größenbeschränkungen scheinen niedriger zu sein als sie sollten
#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);
}
Ist es nicht Race Condition und undefiniertes Verhalten, wenn alle Threads versuchen, an denselben Speicherort zu schreiben? –
Kompilieren Sie mit einem geeigneten Architektur-Switch für Ihre GPU, z. '-arch = sm_35' –
@huseyintugrulbuyukisik nein es ist kein undefiniertes Verhalten, wenn alle Threads den ** gleichen Wert ** schreiben. Nachdem die Schreibvorgänge abgeschlossen sind, enthält der Speicherort garantiert den geschriebenen Wert. –