Created by Vladimir Kuznetsov / @grandrust
Последовательный код 
Параллельное ядро
Последовательный код 
Параллельное ядро
dim3 grid(10, 1, 1)
dim3 block(16, 16, 1)
// или
dim3 grid(10);
dim3 block(16, 16);
kernel <<< nB, nT[, nSM[, nS]] >>> (args*)
// nB: int | dim3 - число блоков в grid
// nT: int | dim3 - число нитей в block'e
| Выполняется на | Может вызываться из | |
|---|---|---|
| __device__ | device | device |
| __global__ | device | host, device* (cc >= 3.5) |
| __host__ | host | host |
cudaMalloc(addr, size)
// Allocates an object in the device global memory
// addr: Address of a pointer to the allocated object
// size: Size of allocated object in terms of bytes
cudaFree(ptr)
// Frees object from device global memory
// ptr: Pointer to freed object
cudaMemcpy(d_ptr, h_ptr, size, type)
// memory data transfer
// d_ptr: Pointer to destination
// h_ptr: Pointer to source
// size: Number of bytes copied
// type: Type/Direction of transfer (cudaMemcpyHostToDevice | cudaMemcpyDeviceToHost)
y[i] = sin(sqrt(x[i])), i = 1..N, xi = 2*Pi*i/N
N = 1024 * 1024
512 нитей в блоке,
x - количество блоков???
#include <stdio.h>
#define N (1024*1024)
__global__ void kernel(float *dA)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
float x = 2.0f * 3.1415926f * (float) idx / (float) N;
dA[idx] = sinf(sqrt(x));
}
int main()
{
float *hA, *dA;
int size = N * sizeof(float);
hA = (float*) malloc(size);
cudaMalloc((void**)&dA, size);
kernel <<< N/512, 512 >>> (dA);
cudaMemcpy(dA, hA, N * sizeof(float), cudaMemcpyDeviceToHost);
for (int i = 0; i < N; i++)
printf("a[%d] = %.5f\n", i, hA[i]);
free(hA);
cudaFree(dA);
return 0;
}
cudaError_t err = cudaMalloc((void **) &dA, size);
if (err != cudaSuccess) {
// ......
}