2016-04-15 5 views
-1

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); 
} 
+0

Ist es nicht Race Condition und undefiniertes Verhalten, wenn alle Threads versuchen, an denselben Speicherort zu schreiben? –

+0

Kompilieren Sie mit einem geeigneten Architektur-Switch für Ihre GPU, z. '-arch = sm_35' –

+0

@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. –

Antwort

0

War im Wesentlichen das gleiche problem as here. Ich musste speziell mit dem Tag -arch=sm_35 kompilieren.

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

Es ist nicht das gleiche Problem wie die Frage, die Sie verknüpfen. Die verknüpfte Frage hat eine Blockgröße, die zu groß ist (für jede GPU). Sobald die Block - und Rastergrößen umgekehrt wurden, würde der Code auf jeder GPU laufen (er überschreitet keine Grenzen) und es gibt keine Erwähnung des Kompilierens mit einem Bogenschalter dort, noch irgendeinen Unterschied zu diesem Code, wenn er mit unserem kompiliert wird ohne irgendeinen Bogenschalter. –

Verwandte Themen