<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[gelöst] Erste Schritte mit CUDA - Compilerfehler]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich setze mich gerade mit CUDA auseinander und verzweifel langsam.</p>
<p>Mein erstes Programm soll einfach zwei Vektoren mit jeweils n Elementen addieren und in einen dritten schreiben.<br />
Der Quelltext ist in zwei Dateien aufgeteilt: zum Einen die main.cpp und die kernel_vector_add.cu. Die Quelltexte sind unten aufgelistet.<br />
Zum compilieren habe ich mittlerweile zwei Makefiles erzeugt, die beide die identischen Fehlermeldungen produzieren. Auch diese sind unten aufgelistet.<br />
Makefile 1 greift das aus den Beispielprojekten bekannte Schema auf. Es werden einfach die zu compilierenden Dateien registriert und die includierte <a href="http://common.mk" rel="nofollow">common.mk</a> übernimmt den Rest. Bei der zweiten Makefile wird alles händisch erzeugt.</p>
<p>Kommen wir zum Wesentlichen. Die Fehlermeldung ist hier unten aufgelistet. Mich irritiert, dass er die angegebenen Variablen nicht finden kann, obwohl die doch eigentlich systemweit verfügbar sein müssten.</p>
<pre><code>nvcc -c main.cpp  -I. -I/usr/local/cuda/include -I/Developer/GPU\ Computing/C/common/inc
In file included from main.cpp:3:
kernel_vector_add.cu: In function ‘void VecAdd(float*, float*, float*, int)’:
kernel_vector_add.cu:8: error: ‘blockDim’ was not declared in this scope
kernel_vector_add.cu:8: error: ‘blockIdx’ was not declared in this scope
kernel_vector_add.cu:8: error: ‘threadIdx’ was not declared in this scope
main.cpp: In function ‘int main(int, char**)’:
main.cpp:29: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:29: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:30: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:30: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:31: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:31: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:36: error: expected primary-expression before ‘&lt;’ token
main.cpp:36: error: expected primary-expression before ‘&gt;’ token
make: *** [main.o] Error 1
</code></pre>
<p>Das CUDA-SDK ist soweit installiert und compiliert und die Beispielprogramme laufen auch korrekt. Insofern liegt das Problem bei mir und meiner Makefile.</p>
<p>Ich bitte euch um eure Hilfe, weil ich absolut nicht mehr weiter weiß.</p>
<p>Beste Grüße</p>
<p>Vic</p>
<p>PS:<br />
Ich entwickel auf einem Mac mit der gcc Version 4.2.1.<br />
Die CUDA Bibliothek liegt in der Version 3.2 vor.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;cuda.h&gt;
#include &quot;kernel_vector_add.cu&quot;
#include &lt;cutil_inline.h&gt;

int main (int argc, char** argv) {
	const unsigned int numElements = 100;
	const unsigned int vecByteSize = numElements * sizeof(float);
	unsigned int i = 0;

	const int threadsPerBlock = 50;
	const int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;

	float* vecA = (float*)malloc(vecByteSize);
	float* vecB = (float*)malloc(vecByteSize);
	float* vecC = (float*)malloc(vecByteSize);

	for (i = 0; i &lt; numElements; ++i) {
		vecA[i] = i;
		vecB[i] = i;
		vecC[i] = 0;
	}

	float* dA = 0;
	float* dB = 0;
	float* dC = 0;

	cudaMalloc(&amp;dA, vecByteSize);
	cudaMalloc(&amp;dB, vecByteSize);
	cudaMalloc(&amp;dC, vecByteSize);

	cudaMemcpy(dA, vecA, vecByteSize, cudaMemcpyHostToDevice);
	cudaMemcpy(dB, vecB, vecByteSize, cudaMemcpyHostToDevice);

	VecAdd&lt;&lt;&lt;blocksPerGrid, threadsPerBlock&gt;&gt;&gt;(dA, dB, dC, numElements);
	cudaThreadSynchronize();

	cudaMemcpy(vecC, dC, vecByteSize, cudaMemcpyDeviceToHost);

	cudaFree(dA);
	cudaFree(dB);
	cudaFree(dC);

	free(vecA);
	free(vecB);
	free(vecC);

	return 0;
}
</code></pre>
<pre><code class="language-cpp">#ifndef __KERNEL_VECTOR_ADD_CU__
#define __KERNEL_VECTOR_ADD_CU__

#include &lt;cuda.h&gt;
#include &lt;cutil_inline.h&gt;

__global__ void VecAdd (float *A, float *B, float *C, int numElements) {
	const int i = blockDim.x * blockIdx.x + threadIdx.x;
	if (i &lt; numElements) {
		C[i] = A[i] + B[i];
	}
}

#endif
</code></pre>
<pre><code># Makefile 1
BINDIR := ./
EXECUTABLE := vecAddSample

CCFILES := 
CUFILES := vectorAdd.cu

ROOTDIR := /Developer/GPU\ Computing/C/common

include $(ROOTDIR)/../common/common.mk
</code></pre>
<pre><code># Makefile 2
PROJECT=VecAdd

CC=g++
NVCC=nvcc
WARNINGS=#-Wall
INCDIR=-I. -I/usr/local/cuda/include -I/Developer/GPU\ Computing/C/common/inc
LIBDIR=-L/usr/local/cuda/lib
CUFILES=kernel_vector_add.cu
LIBS=-lcublas -lcuda -lcudart -lcufft -lcurand -lcusparse -ltlshook

OBJ=main.o kernel_vector_add.cu.o

$(PROJECT) : $(OBJ)
	$(NVCC) -o $(PROJECT) $(OBJ) $(LIBDIR) $(LIBS)

kernel_vector_add.cu.o : kernel_vector_add.cu
	$(NVCC) -c kernel_vector_add.cu -o kernel_vector_add.cu.o $(INCDIR)

main.o : main.cpp
	$(NVCC) -c main.cpp $(WARNINGS) $(INCDIR)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/276306/gelöst-erste-schritte-mit-cuda-compilerfehler</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 11:34:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276306.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Oct 2010 18:29:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Erste Schritte mit CUDA - Compilerfehler on Sat, 30 Oct 2010 19:50:41 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich setze mich gerade mit CUDA auseinander und verzweifel langsam.</p>
<p>Mein erstes Programm soll einfach zwei Vektoren mit jeweils n Elementen addieren und in einen dritten schreiben.<br />
Der Quelltext ist in zwei Dateien aufgeteilt: zum Einen die main.cpp und die kernel_vector_add.cu. Die Quelltexte sind unten aufgelistet.<br />
Zum compilieren habe ich mittlerweile zwei Makefiles erzeugt, die beide die identischen Fehlermeldungen produzieren. Auch diese sind unten aufgelistet.<br />
Makefile 1 greift das aus den Beispielprojekten bekannte Schema auf. Es werden einfach die zu compilierenden Dateien registriert und die includierte <a href="http://common.mk" rel="nofollow">common.mk</a> übernimmt den Rest. Bei der zweiten Makefile wird alles händisch erzeugt.</p>
<p>Kommen wir zum Wesentlichen. Die Fehlermeldung ist hier unten aufgelistet. Mich irritiert, dass er die angegebenen Variablen nicht finden kann, obwohl die doch eigentlich systemweit verfügbar sein müssten.</p>
<pre><code>nvcc -c main.cpp  -I. -I/usr/local/cuda/include -I/Developer/GPU\ Computing/C/common/inc
In file included from main.cpp:3:
kernel_vector_add.cu: In function ‘void VecAdd(float*, float*, float*, int)’:
kernel_vector_add.cu:8: error: ‘blockDim’ was not declared in this scope
kernel_vector_add.cu:8: error: ‘blockIdx’ was not declared in this scope
kernel_vector_add.cu:8: error: ‘threadIdx’ was not declared in this scope
main.cpp: In function ‘int main(int, char**)’:
main.cpp:29: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:29: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:30: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:30: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:31: error: invalid conversion from ‘float**’ to ‘void**’
main.cpp:31: error:   initializing argument 1 of ‘cudaError_t cudaMalloc(void**, size_t)’
main.cpp:36: error: expected primary-expression before ‘&lt;’ token
main.cpp:36: error: expected primary-expression before ‘&gt;’ token
make: *** [main.o] Error 1
</code></pre>
<p>Das CUDA-SDK ist soweit installiert und compiliert und die Beispielprogramme laufen auch korrekt. Insofern liegt das Problem bei mir und meiner Makefile.</p>
<p>Ich bitte euch um eure Hilfe, weil ich absolut nicht mehr weiter weiß.</p>
<p>Beste Grüße</p>
<p>Vic</p>
<p>PS:<br />
Ich entwickel auf einem Mac mit der gcc Version 4.2.1.<br />
Die CUDA Bibliothek liegt in der Version 3.2 vor.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;cuda.h&gt;
#include &quot;kernel_vector_add.cu&quot;
#include &lt;cutil_inline.h&gt;

int main (int argc, char** argv) {
	const unsigned int numElements = 100;
	const unsigned int vecByteSize = numElements * sizeof(float);
	unsigned int i = 0;

	const int threadsPerBlock = 50;
	const int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;

	float* vecA = (float*)malloc(vecByteSize);
	float* vecB = (float*)malloc(vecByteSize);
	float* vecC = (float*)malloc(vecByteSize);

	for (i = 0; i &lt; numElements; ++i) {
		vecA[i] = i;
		vecB[i] = i;
		vecC[i] = 0;
	}

	float* dA = 0;
	float* dB = 0;
	float* dC = 0;

	cudaMalloc(&amp;dA, vecByteSize);
	cudaMalloc(&amp;dB, vecByteSize);
	cudaMalloc(&amp;dC, vecByteSize);

	cudaMemcpy(dA, vecA, vecByteSize, cudaMemcpyHostToDevice);
	cudaMemcpy(dB, vecB, vecByteSize, cudaMemcpyHostToDevice);

	VecAdd&lt;&lt;&lt;blocksPerGrid, threadsPerBlock&gt;&gt;&gt;(dA, dB, dC, numElements);
	cudaThreadSynchronize();

	cudaMemcpy(vecC, dC, vecByteSize, cudaMemcpyDeviceToHost);

	cudaFree(dA);
	cudaFree(dB);
	cudaFree(dC);

	free(vecA);
	free(vecB);
	free(vecC);

	return 0;
}
</code></pre>
<pre><code class="language-cpp">#ifndef __KERNEL_VECTOR_ADD_CU__
#define __KERNEL_VECTOR_ADD_CU__

#include &lt;cuda.h&gt;
#include &lt;cutil_inline.h&gt;

__global__ void VecAdd (float *A, float *B, float *C, int numElements) {
	const int i = blockDim.x * blockIdx.x + threadIdx.x;
	if (i &lt; numElements) {
		C[i] = A[i] + B[i];
	}
}

#endif
</code></pre>
<pre><code># Makefile 1
BINDIR := ./
EXECUTABLE := vecAddSample

CCFILES := 
CUFILES := vectorAdd.cu

ROOTDIR := /Developer/GPU\ Computing/C/common

include $(ROOTDIR)/../common/common.mk
</code></pre>
<pre><code># Makefile 2
PROJECT=VecAdd

CC=g++
NVCC=nvcc
WARNINGS=#-Wall
INCDIR=-I. -I/usr/local/cuda/include -I/Developer/GPU\ Computing/C/common/inc
LIBDIR=-L/usr/local/cuda/lib
CUFILES=kernel_vector_add.cu
LIBS=-lcublas -lcuda -lcudart -lcufft -lcurand -lcusparse -ltlshook

OBJ=main.o kernel_vector_add.cu.o

$(PROJECT) : $(OBJ)
	$(NVCC) -o $(PROJECT) $(OBJ) $(LIBDIR) $(LIBS)

kernel_vector_add.cu.o : kernel_vector_add.cu
	$(NVCC) -c kernel_vector_add.cu -o kernel_vector_add.cu.o $(INCDIR)

main.o : main.cpp
	$(NVCC) -c main.cpp $(WARNINGS) $(INCDIR)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1972815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972815</guid><dc:creator><![CDATA[_Vic_]]></dc:creator><pubDate>Sat, 30 Oct 2010 19:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Erste Schritte mit CUDA - Compilerfehler on Sat, 30 Oct 2010 19:56:37 GMT]]></title><description><![CDATA[<p>OK. Ich habe mir die Beispieldateien nochmal genau angeguckt und bin (endlich) von allein auf die Lösung gekommen. Die möchte ich allen Anfängern natürlich nicht vorenthalten.<br />
Mein erstes Problem war, dass ich C++ und C Code in der main.cpp gemixt habe. CUDA will aber wohl nur reinen C Code sehen. Deshalb habe ich eine Schnittstellenklasse angelegt, in der ich die C-Funktionen, die ich vom C++ Teil aufrufe, exportiere.<br />
Eine weitere Besonderheit ist, dass ihr nicht die kernel_vector_add Objektdatei linken dürft, da ihr sonst eine Fehlermeldung erhaltet, die sich über &quot;duplicate symbol XXXVecAdd_KernelXXX&quot; beschwert.</p>
<p>Summa summarum kommen die folgenden Dateien bei raus.</p>
<p>Makefile</p>
<pre><code class="language-cpp">PROJECT=VecAdd

CC=g++
NVCC=nvcc
WARNINGS=#-Wall
INCDIR=-I. -I/usr/local/cuda/include -I/Developer/GPU\ Computing/C/common/inc
LIBDIR=-L/usr/local/cuda/lib
LIBS=-lcublas -lcuda -lcudart -lcufft -ltlshook

OBJ=main.o  cpp_kernel_interface.cu.o

$(PROJECT) : $(OBJ)
	$(NVCC) -o $(PROJECT) $(OBJ) $(LIBDIR) $(LIBS)

cpp_kernel_interface.cu.o : cpp_kernel_interface.cu
	$(NVCC) -c cpp_kernel_interface.cu -o cpp_kernel_interface.cu.o $(INCDIR)

main.o : main.cpp
	$(NVCC) -c main.cpp $(WARNINGS) $(INCDIR) -o main.o
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

extern &quot;C&quot; void VecAdd (float *A, float *B, float *C, int numElements);

int main (int argc, char** argv) {
	const unsigned int numElements = 100;
	const unsigned int vecByteSize = numElements * sizeof(float);
	unsigned int i = 0;

	float* vecA = new float[vecByteSize];
	float* vecB = new float[vecByteSize];
	float* vecC = new float[vecByteSize];

	for (i = 0; i &lt; numElements; ++i) {
		vecA[i] = 1.0f * i;
		vecB[i] = 1.0f * i;
		vecC[i] = 0.0f;
	}

	VecAdd(vecA, vecB, vecC, numElements);

	for (i = 0; i &lt; numElements; ++i) {
		std::cout &lt;&lt; vecA[i] &lt;&lt; &quot; + &quot; &lt;&lt; vecB[i] &lt;&lt; &quot; = &quot; &lt;&lt; vecC[i] &lt;&lt; std::endl;
	}

	delete vecA;
	delete vecB;
	delete vecC;

	return 0;
}
</code></pre>
<p>cpp_kernel_interface.cu</p>
<pre><code class="language-cpp">#ifndef __CPP_KERNEL_INTERFACE_CU__
#define __CPP_KERNEL_INTERFACE_CU__

#include &lt;cuda.h&gt;
#include &lt;cutil_inline.h&gt;
#include &lt;kernel_vector_add.cu&gt;

extern &quot;C&quot; void VecAdd (float *A, float *B, float *C, int numElements) {
	unsigned int vecByteSize = numElements * sizeof(float);

	float* dA = 0;
	float* dB = 0;
	float* dC = 0;

	const int threadsPerBlock = 50;
	const int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;

	cudaMalloc((void**)&amp;dA, vecByteSize);
	cudaMalloc((void**)&amp;dB, vecByteSize);
	cudaMalloc((void**)&amp;dC, vecByteSize);

	cudaMemcpy(dA, A, vecByteSize, cudaMemcpyHostToDevice);
	cudaMemcpy(dB, B, vecByteSize, cudaMemcpyHostToDevice);

	VecAdd_Kernel&lt;&lt;&lt; blocksPerGrid, threadsPerBlock &gt;&gt;&gt;(dA, dB, dC, numElements);

	cudaThreadSynchronize();

	cudaMemcpy(C, dC, vecByteSize, cudaMemcpyDeviceToHost);

	cudaFree(dA);
	cudaFree(dB);
	cudaFree(dC);

}

#endif
</code></pre>
<p>kernel_vector_add.cu</p>
<pre><code class="language-cpp">#ifndef __KERNEL_VECTOR_ADD_CU__
#define __KERNEL_VECTOR_ADD_CU__

#include &lt;cuda.h&gt;
#include &lt;cutil_inline.h&gt;

__global__ void VecAdd_Kernel (float *A, float *B, float *C, int numElements) {
	const int i = blockDim.x * blockIdx.x + threadIdx.x;
	if (i &lt; numElements) {
		C[i] = A[i] + B[i];
	}
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1972843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972843</guid><dc:creator><![CDATA[_Vic_]]></dc:creator><pubDate>Sat, 30 Oct 2010 19:56:37 GMT</pubDate></item></channel></rss>