Ich habe die folgende Struktur in einem Code und es wurde viele Male verwendet. Um die Lesbarkeit des Codes zu verbessern und die Anzahl der Zeilen zu verringern, muss ich stattdessen ein Makro verwenden. Der Teil, den ich freue mich auf ein Makro für sie zu schreiben ist wie folgt:Schreiben eines C-Makros zur Verwendung in einem CUDA-Kernel
#define _UNROLL_FACTOR_volIntGrad 32
int jj = 0;
for (; jj < (ngbSize - 32); jj += 32) {
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 32; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/2)); jj+= (_UNROLL_FACTOR_volIntGrad/2)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 16; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/4)); jj+= (_UNROLL_FACTOR_volIntGrad/4)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 8; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/8)); jj+= (_UNROLL_FACTOR_volIntGrad/8)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 4; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad/16)); jj+= (_UNROLL_FACTOR_volIntGrad/16)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 2; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < ngbSize; jj++){
int j = offset + jj;
...
arbitrary calculation 3
...
}
}
durch willkürliche Berechnung X, ich eine Reihe von Berechnungen bedeuten, die unabhängig von Makro ist und unterscheidet Funktion für Funktion. Weiß jemand, wie man dieses Makro schreibt, um die Größe der oben genannten Struktur zu verringern? zum Beispiel wie folgt aus:
__MACRO
arbitrary calculation 1
arbitrary calculation 2
arbitrary calculation 3
__END
Betrachten Sie eine Funktion vor einem Makro – wasthishelpful
ich Sie schon ein gutes Stück von Tests, die manuell Abrollen (und die entsprechende Erhöhung der Komplexität und Abnahme zu schaffen gemacht anmaßen schreiben in der Lesbarkeit) verursacht einen statistisch signifikanten und lohnenden Leistungsvorteil? – EOF
@EOF Ja genau richtig! Dieser Teil eines GPU-Kerns muss wirklich die Schleifengröße für den Compiler wissen lassen, um das Ausrollen zu ermöglichen, um die Leistung zu verbessern. Aber die Lesbarkeit sinkt :-(. – Siamak