L
DirkB schrieb:
Larkis schrieb:
So hab es jetzt soweit hinbekommen.
Ich habe die große Formel in mehrere Terme zerlegt die das programm nacheinander abarbeiten kann und nun läuft der Laden.
Zwischen läuft und funktioniert richtig gibt es auch Unterschiede.
Larkis schrieb:
Und ja ich geb zu mir fehlt aktuell etwas die Praxis gerade mit den Variablen und deren umrechnung. Nervige kleine Dinge.
Das sind enorm wichtige Grundlagen.
Vor allem, weil da in sehr vielen Programmiersprachen so ist.
Was soll ich machen... Seid Ewigkeiten nicht mehr Programmiert, dann nur mit Java und nun will der Cheff das ich ihm was in CUDA hinzaubere.
Ich habe jetzt 2 Wochen C durchgeackert, dann ne Woche WINAPI um das Programm zu Vorführungszwecken schonmal damit zu realisieren und nun soll ich die Testversion, da ich ja so schön im Zeitplan liege nochmal auf Cuda umsetzen. Und seid einer Woche sitze ich hier mit nem CUDA Handbuch.
Hab mir das auch net unbedingt so ausgesucht, aber wie heißt es so schön, learning by doing und jeden Fehler macht man nur einmal. :p
Ok aktueller Stand ist das mein Programm läuft. Es zeichnet den gewünschten Bereich der Funktion in einem Feld von 500x500 Pixel. Dabei spuckt er aber folgendes im Ereignisfenster aus:
Eine Ausnahme (erste Chance) bei 0x7695b9bc in Cuda1.exe: Microsoft C++-Ausnahme: cudaError_enum an Speicherposition 0x002af730..
Nun möchte ich die Darstellung auf 1000x1000 Pixel erhöhen. Ist ja einfach nur den DIm Wert verändern, danach bricht aber der Grafiktreiber zusammen und die Funktion wird nur zur Hälfte dargestellt.
Neues Rätsel neues Glück. Und schonmal vielen Dank für die Hilfe.
#include "../common/cpu_bitmap.h"
#include "../common/book.h"
#include "math.h"
#include "stdio.h"
const int DIM = 500;
__device__ float cosinus( float y1) {
return cos(y1 / 350);
}
__device__ float sinus( float x1) {
return sin(x1 / 160);
}
__device__ float rechnung1( float z1) {
return (150 - z1 / 10) / 150;
}
__device__ float rechnung2() {
return 255 / 2;
}
__device__ float formel1(float zahl1, float sin1, float cos1, float zahl2 ) {
return 255 - (zahl1 * (sin1 * cos1) * zahl2);
}
__global__ void kernel( unsigned char *ptr){
int x = blockIdx.x;
int y = blockIdx.y;
float x1 = blockIdx.x;
float y1 = blockIdx.y;
float z1 = 300;
int offset = x + y * gridDim.x;
float sin1 = sinus(x1);
float cos1 = cosinus(y1);
float zahl1 = rechnung1(z1);
float zahl2 = rechnung2();
float formel = formel1(zahl1, sin1, cos1, zahl2);
ptr[offset*4 + 0] = 0;
ptr[offset*4 + 1] = 0;
ptr[offset*4 + 2] = formel;
ptr[offset*4 + 3] = 255;
}
int main ( void ) {
CPUBitmap bitmap( DIM, DIM );
unsigned char *dev_bitmap;
cudaMalloc ( (void**)&dev_bitmap, bitmap.image_size() );
dim3 grid(DIM, DIM);
kernel<<<grid,1>>>(dev_bitmap );
cudaMemcpy( bitmap.get_ptr(), dev_bitmap, bitmap.image_size(), cudaMemcpyDeviceToHost);
bitmap.display_and_exit();
cudaFree( dev_bitmap);
}