Skip to content

Commit c236386

Browse files
authored
[gsoc25] Add clad projects for compiler research (#1664)
1 parent acade4e commit c236386

File tree

4 files changed

+209
-3
lines changed

4 files changed

+209
-3
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: Integrate Clad to PyTorch and compare the gradient execution times
3+
layout: gsoc_proposal
4+
project: Clad
5+
year: 2025
6+
difficulty: medium
7+
duration: 350
8+
mentor_avail: June-October
9+
organization:
10+
- CompRes
11+
---
12+
13+
## Description
14+
15+
PyTorch is a popular machine learning framework that includes its own automatic differentiation engine, while Clad is a Clang plugin for automatic differentiation that performs source-to-source transformation to generate functions capable of computing derivatives at compile time.
16+
17+
This project aims to integrate Clad-generated functions into PyTorch using its C++ API and expose them to a Python workflow. The goal is to compare the execution times of gradients computed by Clad with those computed by PyTorch’s native autograd system. Special attention will be given to CUDA-enabled gradient computations, as PyTorch also offers GPU acceleration capabilities.
18+
19+
## Expected Results
20+
21+
* Incorporate Clad’s API components (such as `clad::array` and `clad::tape`) into PyTorch using its C++ API
22+
* Pass Clad-generated derivative functions to PyTorch and expose them to Python
23+
* Perform benchmarks comparing the execution times and performance of Clad-derived gradients versus PyTorch’s autograd
24+
* Automate the integration process
25+
* Document thoroughly the integration process and the benchmark results and identify potential bottlenecks in Clad’s execution
26+
* Present the work at the relevant meetings and conferences.
27+
28+
29+
## Requirements
30+
31+
* Automatic differentiation
32+
* C++ programming
33+
* Clang frontend
34+
35+
## Mentors
36+
* **[Vassil Vassilev](mailto:[email protected])**
37+
* [Christina Koutsou](mailto:@[email protected])
38+
39+
## Links
40+
* [Repo](https://github.com/vgvassilev/clad)
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
---
2+
title: Enable automatic differentiation of C++ STL concurrency primitives in Clad
3+
layout: gsoc_proposal
4+
project: Clad
5+
year: 2025
6+
difficulty: medium
7+
duration: 350
8+
mentor_avail: June-October
9+
organization:
10+
- CompRes
11+
---
12+
13+
## Description
14+
15+
Clad is an automatic differentiation (AD) clang plugin for C++. Given a C++ source code of a mathematical function, it can automatically generate C++ code for computing derivatives of the function. This project focuses on enabling automatic differentiation of codes that utilise C++ concurrency features such as `std::thread`, `std::mutex`, atomic operations and more. This will allow users to fully utilize their CPU resources.
16+
17+
## Expected Results
18+
19+
* Explore C++ concurrency primitives and prepare a report detailing the associated challenges involved and the features that can be feasibly supported within the given timeframe.
20+
* Add concurrency primitives support in Clad’s forward-mode automatic differentiation.
21+
* Add concurrency primitives support in Clad’s reverse-mode automatic differentiation.
22+
* Add proper tests and documentation.
23+
* Present the work at the relevant meetings and conferences.
24+
25+
An example demonstrating the use of differentiation of codes utilizing parallelization primitives:
26+
27+
```
28+
#include <cmath>
29+
#include <iostream>
30+
#include <mutex>
31+
#include <numeric>
32+
#include <thread>
33+
#include <vector>
34+
#include "clad/Differentiator/Differentiator.h"q
35+
36+
using VectorD = std::vector<double>;
37+
using MatrixD = std::vector<VectorD>;
38+
39+
std::mutex m;
40+
41+
VectorD operator*(const VectorD &l, const VectorD &r) {
42+
VectorD v(l.size());
43+
for (std::size_t i = 0; i < l.size(); ++i)
44+
v[i] = l[i] * r[i];
45+
return v;
46+
}
47+
48+
double dot(const VectorD &v1, const VectorD &v2) {
49+
VectorD v = v1 * v2;
50+
return std::accumulate(v.begin(), v.end(), 0.0);
51+
}
52+
53+
double activation_fn(double z) { return 1 / (1 + std::exp(-z)); }
54+
55+
double compute_loss(double y, double y_estimate) {
56+
return -(y * std::log(y_estimate) + (1 - y) * std::log(1 - y_estimate));
57+
}
58+
59+
void compute_and_add_loss(VectorD x, double y, const VectorD &weights, double b,
60+
double &loss) {
61+
double z = dot(x, weights) + b;
62+
double y_estimate = activation_fn(z);
63+
std::lock_guard<std::mutex> guard(m);
64+
loss += compute_loss(y, y_estimate);
65+
}
66+
67+
/// Compute total loss associated with a single neural neural-network.
68+
/// y_estimate = activation_fn(dot(X[i], weights) + b)
69+
/// Loss of a training data point = - (y_actual * std::log(y_estimate) + (1 - y_actual) * std::log(1 - y_estimate))
70+
/// total loss: summation of loss for all the data points
71+
double compute_total_loss(const MatrixD &X, const VectorD &Y,
72+
const VectorD &weights, double b) {
73+
double loss = 0;
74+
const std::size_t num_of_threads = std::thread::hardware_concurrency();
75+
std::vector<std::thread> threads(num_of_threads);
76+
int thread_id = 0;
77+
for (std::size_t i = 0; i < X.size(); ++i) {
78+
if (threads[thread_id].joinable())
79+
threads[thread_id].join();
80+
threads[thread_id] =
81+
std::thread(compute_and_add_loss, std::cref(X[i]), Y[i],
82+
std::cref(weights), b, std::ref(loss));
83+
thread_id = (thread_id + 1) % num_of_threads;
84+
}
85+
for (std::size_t i = 0; i < num_of_threads; ++i) {
86+
if (threads[i].joinable())
87+
threads[i].join();
88+
}
89+
90+
return loss;
91+
}
92+
93+
int main() {
94+
auto loss_grad = clad::gradient(compute_total_loss);
95+
// Fill the values as required!
96+
MatrixD X;
97+
VectorD Y;
98+
VectorD weights;
99+
double b;
100+
101+
// derivatives
102+
// Zero the derivative variables and make them of the same dimension as the
103+
// corresponding primal values.
104+
MatrixD d_X;
105+
VectorD d_Y;
106+
VectorD d_weights;
107+
double d_b = 0;
108+
109+
loss_grad.execute(X, Y, weights, b, &d_X, &d_Y, &d_weights, &d_b);
110+
111+
std::cout << "dLossFn/dW[2]: " << d_weights[2] << "\n"; // Partial derivative of the loss function w.r.t weight[2]
112+
std::cout << "dLossFn/db: " << d_b << "\n"; // Partial derivative of the loss function w.r.t b
113+
}
114+
```
115+
116+
## Requirements
117+
118+
* Automatic differentiation
119+
* Parallel programming
120+
* Reasonable expertise in C++ programming
121+
122+
## Mentors
123+
* **[Vassil Vassilev](mailto:[email protected])**
124+
* [David Lange](mailto:[email protected])
125+
126+
## Links
127+
* [Repo](https://github.com/vgvassilev/clad)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: Support usage of Thrust API in Clad
3+
layout: gsoc_proposal
4+
project: Clad
5+
year: 2025
6+
difficulty: medium
7+
duration: 350
8+
mentor_avail: June-October
9+
organization:
10+
- CompRes
11+
---
12+
13+
## Description
14+
15+
The rise of ML has shed light into the power of GPUs and researchers are looking for ways to incorporate them in their projects as a lightweight parallelization method. Consequently, General Purpose GPU programming is becoming a very popular way to speed up execution time.
16+
17+
Clad is a clang plugin for automatic differentiation that performs source-to-source transformation and produces a function capable of computing the derivatives of a given function at compile time. This project aims to enhance Clad by adding support for Thrust, a parallel algorithms library designed for GPUs and other accelerators. By supporting Thrust, Clad will be able to differentiate algorithms that rely on Thrust’s parallel computing primitives, unlocking new possibilities for GPU-based machine learning, scientific computing, and numerical optimization.
18+
19+
## Expected Results
20+
21+
* Research and decide on the most valuable Thrust functions to support in Clad
22+
* Create pushforward and pullback functions for these Thrust functions
23+
* Write tests that cover the additions
24+
* Include demos of using Clad on open source code examples that call Thrust functions
25+
* Write documentation on which Thrust functions are supported in Clad
26+
* Present the work at the relevant meetings and conferences.
27+
28+
## Requirements
29+
30+
* Automatic differentiation
31+
* C++ programming
32+
* Clang frontend
33+
34+
## Mentors
35+
* **[Christina Koutsou](mailto:@[email protected])**
36+
* [Vassil Vassilev](mailto:[email protected])
37+
38+
## Links
39+
* [Repo](https://github.com/vgvassilev/clad)

_gsocproposals/2025/proposal_CppInterop-API-ExposeMemory.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ Clang and LLVM provide access to C++ from other programming languages, but curre
3232
* Knowledge of Clang and LLVM
3333

3434
## Mentors
35-
* **[Vassil Vassilev](mailto:vvasilev@cern.ch)**
36-
* [Aaron Jomy](mailto:aaron.jomy@cern.ch)
37-
* [David Lange](mailto:[email protected])
35+
* **[Aaron Jomy](mailto:aaron.jomy@cern.ch)**
36+
* [Vassil Vassilev](mailto:vvasilev@cern.ch)
37+
3838

3939
## Links
4040
* [Repo](https://github.com/compiler-research/CppInterOp)

0 commit comments

Comments
 (0)